在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]
答案 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
MATLAB文档说容器对于保存小值最有效 - 标量(?)和字符串。我还没有看到关于在一个单元中收集容器的讨论。
如果您对numpy / MATLAB数据交换集合感兴趣,那么仍然可能存在问题 - 取决于它将它们保存到.mat文件的方式。