MATLAB 数组和容器
MATLAB arrays and containers
我刚开始使用 MATLAB,之前主要玩过 Python。我刚刚制作了我的第一个关联数组,对它如何处理逗号和空格有点困惑。我的数组是:
co_comma=containers.Map({'Open University','UCL',' University of Edinburgh','Birkbeck'},{193835,21210,24525,17822})
我还做了第二个关联数组,用空格分割:
co_space=containers.Map({'Open University' 'UCL' ' University of Edinburgh' 'Birkbeck'},{193835 21210 24525 17822})
他们都给出了以下内容:
地图属性:
Count: 4
KeyType: char
ValueType: double
但是 co_comma==co_space
给出 False
:
ans =
logical
0
问题:
- 这些关联数组有何不同
- 容器究竟是什么?虽然我从来没有以这种方式想到列表等,但 Python 似乎有 lists/tuples/general 可迭代形式的容器 - 。那么 matlab 字符串容器与 matlab 字符数组的不同之处是否与(例如)python 列表和 python 元组不同?
谢谢 :D
这里混杂了很多东西!
澄清:
一个matlab容器只相当于一个python字典,而不是一个list/tuple/general可迭代
你的两个容器都是一样的。您似乎将它们命名为逗号和space,但这种区分甚至没有达到容器的定义。
{'Open University','UCL',' University of Edinburgh','Birkbeck'}
和 {'Open University' 'UCL' ' University of Edinburgh' 'Birkbeck'}
都创建了完全相同的元胞数组,因此 container.map
的输入是相同的。您正在比较 a=[5];
和 b=5
,作为 MATLAB 有效的类比。他们是一样的。
对于对象,大多数编程语言(包括 python!)在比较两个包含相同值但属于不同对象的对象时都会给出 false。只有基本变量倾向于按值进行比较,而不是按某种 objecID
。在你的情况下,简单地做 isequal(co_comma,co_space)
将 return true
,所以它们的值是相同的(正如我们已经知道的,从前一点)
MATLAB 中通常不使用容器,除非您特别想要字典。
所以这是与 Matlab 的交易:Matlab 是一个古怪的人。在 Matlab 中,everything 是一个数组,常规“值”和“容器”或“集合”之间没有像许多编程语言中那样的真正区别。在 Matlab 中,任何数值都是一个数值数组。任何 string
值实际上都是一个字符串数组。每个值都是可迭代的,并且可以在 for
循环或其他类似“列表”的上下文中使用。 Matlab 中的每个类型或 class 都必须实现 collection/container 行为及其“普通”值语义。
Matlab 中的标量值实际上是大小为 1×1 的二维数组的退化情况。人数42
?实际上是一个长度为 1 的双精度数组。字符串 "foo"
?实际上是一个长度为 1 的字符串数组。 Matlab 中的一切 实际上就像 Python 中的列表(或者更准确地说,NumPy 序列或数组)。
一个cell
数组是一个事物的数组,它可以在它的每个元素中包含任何其他类型的数组。这用于异构集合。
一个char
数组有点奇怪,因为它用来表示字符串,但是它的元素本身并不是字符串,而是字符。普通 char
数组以一种奇怪的方式用于表示字符串列表:您创建一个二维 char
数组,并将每一行读取为在右侧用空格填充的字符串。不同长度的字符串列表过去被表示为“cellstrs”,它们是 cell
数组,每个元素中包含 char
行向量。有点奇怪;参见 my blog post about it。新的 string
数组使大多数其他字符串类型的使用都过时了。您可能想在这里使用 string
s。在 Matlab 中,string
字面量是双引号,char
字面量是单引号。
“容器”这个词在 Matlab 中没有特定的技术含义,也不是真正的东西。有 containers
包,但里面只有 containers.Map
;没有其他类型的容器,也没有概括容器的含义。一位 Matlab 开发人员有一个制作这样的容器的想法,但它从未真正付诸实施。据我所知,containers.Map
几乎没有被使用:containers.Map
是一个按引用传递的“句柄”对象,而大多数 Matlab 类型都是按值传递的,所以 Map
不能轻松地与大多数 Matlab 代码一起使用。
因此,撇开 char
s 的怪异不谈,Matlab 中的所有东西 都具有数组语义,并且实际上是一个可迭代的容器,例如 Python 列表或元组。在 Matlab 中,大多数值和对象都是不可变的和按值传递的,因此它们更像是 Python 元组而不是 Python 列表。
我刚开始使用 MATLAB,之前主要玩过 Python。我刚刚制作了我的第一个关联数组,对它如何处理逗号和空格有点困惑。我的数组是:
co_comma=containers.Map({'Open University','UCL',' University of Edinburgh','Birkbeck'},{193835,21210,24525,17822})
我还做了第二个关联数组,用空格分割:
co_space=containers.Map({'Open University' 'UCL' ' University of Edinburgh' 'Birkbeck'},{193835 21210 24525 17822})
他们都给出了以下内容:
地图属性:
Count: 4
KeyType: char
ValueType: double
但是 co_comma==co_space
给出 False
:
ans =
logical
0
问题:
- 这些关联数组有何不同
- 容器究竟是什么?虽然我从来没有以这种方式想到列表等,但 Python 似乎有 lists/tuples/general 可迭代形式的容器 - 。那么 matlab 字符串容器与 matlab 字符数组的不同之处是否与(例如)python 列表和 python 元组不同?
谢谢 :D
这里混杂了很多东西!
澄清:
一个matlab容器只相当于一个python字典,而不是一个list/tuple/general可迭代
你的两个容器都是一样的。您似乎将它们命名为逗号和space,但这种区分甚至没有达到容器的定义。
{'Open University','UCL',' University of Edinburgh','Birkbeck'}
和{'Open University' 'UCL' ' University of Edinburgh' 'Birkbeck'}
都创建了完全相同的元胞数组,因此container.map
的输入是相同的。您正在比较a=[5];
和b=5
,作为 MATLAB 有效的类比。他们是一样的。对于对象,大多数编程语言(包括 python!)在比较两个包含相同值但属于不同对象的对象时都会给出 false。只有基本变量倾向于按值进行比较,而不是按某种
objecID
。在你的情况下,简单地做isequal(co_comma,co_space)
将 returntrue
,所以它们的值是相同的(正如我们已经知道的,从前一点)MATLAB 中通常不使用容器,除非您特别想要字典。
所以这是与 Matlab 的交易:Matlab 是一个古怪的人。在 Matlab 中,everything 是一个数组,常规“值”和“容器”或“集合”之间没有像许多编程语言中那样的真正区别。在 Matlab 中,任何数值都是一个数值数组。任何 string
值实际上都是一个字符串数组。每个值都是可迭代的,并且可以在 for
循环或其他类似“列表”的上下文中使用。 Matlab 中的每个类型或 class 都必须实现 collection/container 行为及其“普通”值语义。
Matlab 中的标量值实际上是大小为 1×1 的二维数组的退化情况。人数42
?实际上是一个长度为 1 的双精度数组。字符串 "foo"
?实际上是一个长度为 1 的字符串数组。 Matlab 中的一切 实际上就像 Python 中的列表(或者更准确地说,NumPy 序列或数组)。
一个cell
数组是一个事物的数组,它可以在它的每个元素中包含任何其他类型的数组。这用于异构集合。
一个char
数组有点奇怪,因为它用来表示字符串,但是它的元素本身并不是字符串,而是字符。普通 char
数组以一种奇怪的方式用于表示字符串列表:您创建一个二维 char
数组,并将每一行读取为在右侧用空格填充的字符串。不同长度的字符串列表过去被表示为“cellstrs”,它们是 cell
数组,每个元素中包含 char
行向量。有点奇怪;参见 my blog post about it。新的 string
数组使大多数其他字符串类型的使用都过时了。您可能想在这里使用 string
s。在 Matlab 中,string
字面量是双引号,char
字面量是单引号。
“容器”这个词在 Matlab 中没有特定的技术含义,也不是真正的东西。有 containers
包,但里面只有 containers.Map
;没有其他类型的容器,也没有概括容器的含义。一位 Matlab 开发人员有一个制作这样的容器的想法,但它从未真正付诸实施。据我所知,containers.Map
几乎没有被使用:containers.Map
是一个按引用传递的“句柄”对象,而大多数 Matlab 类型都是按值传递的,所以 Map
不能轻松地与大多数 Matlab 代码一起使用。
因此,撇开 char
s 的怪异不谈,Matlab 中的所有东西 都具有数组语义,并且实际上是一个可迭代的容器,例如 Python 列表或元组。在 Matlab 中,大多数值和对象都是不可变的和按值传递的,因此它们更像是 Python 元组而不是 Python 列表。