MATLAB与Python中的dict列表的等价物是什么?
在Python中:MATLAB与Python中的dict列表的等价物是什么?,python,matlab,append,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:'1'},{2:'2'},{3:'3'}] 如果我们可以说containers.Map是python dict的基本等
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:'1'},{2:'2'},{3:'3'}]
如果我们可以说containers.Map是python dict的基本等价物,那么MATLAB与上面的python append的等价物是什么
我在MATLAB中尝试的内容:
知道:
>a=[];
>b=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]
可能的等效物是包含以下结构的单元:
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年代末)
另一种可能是结构数组。从倍频程文档:
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
有时,使用scipy.io.loadmat/savemat
在MATLAB和numpy
之间来回写入对象会有所帮助。这些开发人员已经计算出一组等价物
比较结构和容器的其他SO问题: MATLAB文档表示,容器对于保存小值(标量(?)和字符串)最为有效。我还没见过关于在牢房里收集容器的讨论
如果您对numpy/MATLAB数据交换集合感兴趣,那么它仍然可能是一个问题,这取决于它如何将它们保存到.mat文件。containers.Map类不支持与数字数组相同的数组连接(部分原因是
Map
类重载了一些数组访问函数),因此无法创建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]
请注意,所有这三个都增加了大小。我只是想警告您,如果这与Python中的行为不同(我不知道Python中的行为是什么).,可能吧。@excaza谢谢。不过,我想问一下
容器.Map
,它似乎与python dict类似,我想知道如何创建一个列表,例如映射容器的单元格数组
。除非一个结构实际上与python dict更为相似?谢谢。可以这样做吗作为映射容器的单元数组
,或者你会建议不要这样做吗?仔细研究一下,我发现映射容器
从2008年就已经存在,并且基于Java
哈希映射
。它们确实更接近Python字典。最近的一个MATLAB问题将它们与结构进行了比较,谢谢。这些链接很有帮助。
>> 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{1}('fourth') = 4;
>> a
a =
[4x1 containers.Map] [4x1 containers.Map] [4x1 containers.Map]