什么是MATLAB相当于Python中的dicts列表?

时间:2016-02-16 21:17:27

标签: python matlab append

在Python中:

my_list = []
my_dict_a = {1: 'one'}
my_dict_b = {2: 'two'}
my_dict_c = {3: 'three'}
my_list.append(my_dict_a)
my_list.append(my_dict_b)
my_list.append(my_dict_c)

my_list现在等于[{1: 'one'}, {2: 'two'}, {3: 'three'}]

如果我们可以说container.Map是python dict的基本等价物,那么MATLAB与上面的python相同的是什么?

我在MATLAB中尝试过:

知:

>a=[];
>b=1;    
>a = [a, b]

a =  1

>a = [a, b]

a = 1     1

>a = [a, b]

a = 1     1     1

>a={};
>b=1;
>a=[a,b]

a = [1]

>a=[a,b]

a = [1]    [1]

>a=[a,b]

a = [1]    [1]    [1]

>a = [a; b]

a = 1

>a = [a; b]

a = 1
    1

>a = [a; b]

a =
     1
     1
     1

然而当我尝试对containers.Map对象做同样的事情时:

>dictA=containers.Map();
>dictA('first')=1;
>dictA('second')=2;
>dictA('third')=3;

>a=[];
>a = [a, dictA]

a = 

  Map with properties:

        Count: 3
      KeyType: char
    ValueType: any

>a = [a, dictA]
Error using containers.Map/horzcat
Horizontal concatenation is not supported by a containers.Map.

确定。但是怎么样:

>a=[];
>a = [a; dictA]

a = 

  Map with properties:

        Count: 3
      KeyType: char
    ValueType: any

>a = [a; dictA]

a = 

  Map with properties:

        Count: 3
      KeyType: char
    ValueType: any

>whos a
  Name      Size            Bytes  Class             Attributes

  a         3x1               112  containers.Map

但它没有继续追加:

>a={};
>a = [a; dictA]

a = 

  Map with properties:

        Count: 3
      KeyType: char
    ValueType: any

>a = [a; dictA]

a = 

  Map with properties:

        Count: 3
      KeyType: char
    ValueType: any

>whos a
  Name      Size            Bytes  Class             Attributes

  a         3x1               112  containers.Map     

然而

>{dictA}

ans = 

    [3x1 containers.Map]


>a = {};
>a = [{a}; {dictA}]

a = 

    {}
    [3x1 containers.Map]

>a = [{a}; {dictA}]

a = 

    {2x1 cell          }
    [3x1 containers.Map]

>whos a
  Name      Size            Bytes  Class    Attributes

  a         2x1               672  cell               

>a = [{a}; {dictA}]

a = 

    {2x1 cell          }
    [3x1 containers.Map]

>whos a
  Name      Size            Bytes  Class    Attributes

  a         2x1              1008  cell       

>a = {};
>a = {a dictA}

a = 

    {}    [3x1 containers.Map]

>whos a
  Name      Size            Bytes  Class    Attributes

  a         1x2               336  cell               

a = {a dictA}

a = 

    {1x2 cell}    [3x1 containers.Map]

>whos a
  Name      Size            Bytes  Class    Attributes

  a         1x2               672  cell 

最后

>a = {};
>a = {[a] [dictA]}

a = 

    {}    [3x1 containers.Map]

>a = {[a] [dictA]}

a = 

    {1x2 cell}    [3x1 containers.Map]

>a = {[a] [dictA]}

a = 

    {1x2 cell}    [3x1 containers.Map]

2 个答案:

答案 0 :(得分:2)

containers.Map类不支持与数值数组相同的数组连接(部分原因是Map类重载了一些数组访问函数)。因此,您无法创建Map个对象数组(尽管在尝试垂直连接时缺少错误消息)。

containers.Map个对象

的单元格数组

但是,您可以创建Map个对象的单元格数组;你只需要注意语法。你非常接近,但我认为这就是你想要的:

>> a = {};
>> a = [a, {dictA}]
a = 
    [3x1 containers.Map]

>> a = [a, {dictA}]
a = 
    [3x1 containers.Map]    [3x1 containers.Map]

>> a = [a, {dictA}]
a = 
    [3x1 containers.Map]    [3x1 containers.Map]    [3x1 containers.Map]

>> a{1}('first')
ans =
     1

我们可以使用分号代替将它们垂直连接a = [a; {dictA}]

单元格数组,{}[]

我想到这一点的方式是{}用于将东西放入单元格(并将它们取出),而[]是连接操作,也可用于单元格数组。

a = {}a指定为空单元格数组。

a = [a, {dictA}]dictA放入一个单元格中,然后将此1x1单元格数组与单元格数组a连接起来。

a = [{a}, {dictA}]会将a置于另一个单元格数组中,从而导致您遇到的奇怪的嵌套单元格数组。

a{1}返回单元格数组a中第一个单元格的内容,在本例中为Map个对象。

在我看来,在学习MATLAB时,单元格数组和各种括号/括号的使用是最令人困惑的事情之一。

小心!这些是浅拷贝

请注意,MATLAB称之为“句柄类”,这意味着a{1}a{2}dictA都是指向同一对象的指针/引用。因此:

>> a{1}('fourth') = 4;
>> a
a = 
    [4x1 containers.Map]    [4x1 containers.Map]    [4x1 containers.Map]

请注意,其中所有3个都增加了。只是想警告你,以防这与Python中的行为不同(我不知道Python中的行为是什么)。

答案 1 :(得分:0)

可能的等价物是包含结构的单元格:

octave:52> d1.val='one';d2.val='two';d3.val='three';
octave:53> c={d1,d2,d3};
octave:54> c
c = 
{
  [1,1] =
    scalar structure containing the fields:
      val = one
  [1,2] =
    scalar structure containing the fields:
      val = two
  [1,3] =
    scalar structure containing the fields:
      val = three
}
octave:55> c{2}.val
ans = two

单元格具有列表的内容灵活性。结构就像字典,虽然对键有更多限制。或者可能是你可以将它们比作Python对象。实际上,MATLAB中的初始“对象”实现是建立在结构之上的(在20世纪90年代后期)。

另一种可能性是结构数组。来自Octave的文档:

 x(1).a = "string1";
 x(2).a = "string2";
 x(1).b = 1;
 x(2).b = 2;

octave:65> x
x =
  1x2 struct array containing the fields:
    a
    b
octave:66> x(1)
ans =
  scalar structure containing the fields:
    a = string1
    b =  1

有时使用numpy在MATLAB和scipy.io.loadmat/savemat之间来回写入对象会有所帮助。那些开发人员已经制定了一组等价物。

比较结构和容器的其他SO问题:

The difference between a container map and a struct in matlab

Hash tables in MATLAB

MATLAB文档说容器对于保存小值最有效 - 标量(?)和字符串。我还没有看到关于在一个单元中收集容器的讨论。

如果您对numpy / MATLAB数据交换集合感兴趣,那么仍然可能存在问题 - 取决于它将它们保存到.mat文件的方式。