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

问题:

  1. 这些关联数组有何不同
  2. 容器究竟是什么?虽然我从来没有以这种方式想到列表等,但 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 数组使大多数其他字符串类型的使用都过时了。您可能想在这里使用 strings。在 Matlab 中,string 字面量是双引号,char 字面量是单引号。

“容器”这个词在 Matlab 中没有特定的技术含义,也不是真正的东西。有 containers 包,但里面只有 containers.Map;没有其他类型的容器,也没有概括容器的含义。一位 Matlab 开发人员有一个制作这样的容器的想法,但它从未真正付诸实施。据我所知,containers.Map 几乎没有被使用:containers.Map 是一个按引用传递的“句柄”对象,而大多数 Matlab 类型都是按值传递的,所以 Map 不能轻松地与大多数 Matlab 代码一起使用。

因此,撇开 chars 的怪异不谈,Matlab 中的所有东西 都具有数组语义,并且实际上是一个可迭代的容器,例如 Python 列表或元组。在 Matlab 中,大多数值和对象都是不可变的和按值传递的,因此它们更像是 Python 元组而不是 Python 列表。