在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'}]
。在
如果我们能说容器。地图基本相当于一个python dict,MATLAB等价于上面的python append是什么?在
我在MATLAB中所做的尝试:
了解:
^{pr2}$以及
>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]
一个可能的等效物是包含以下结构的单元:
单元格具有列表的内容灵活性。结构就像字典,尽管对键有更多的限制。或者你可以把它们比作Python对象。事实上,MATLAB中最初的“object”实现是建立在结构之上的(在20世纪90年代末)。
另一种可能是结构数组。从Octave文档:
^{pr2}$有时使用
scipy.io.loadmat/savemat
在MATLAB和numpy
之间来回编写对象是有帮助的。那些开发人员已经找到了一套等价物。比较结构和容器的其他SO问题:
The difference between a container map and a struct in matlab
Hash tables in MATLAB
MATLAB文档说容器对于保存小值(标量(?)还有琴弦。我还没见过在牢房里收集容器的讨论。
如果您对numpy/MATLAB的数据交换感兴趣,那么收集数据仍然是个问题,这取决于它如何将它们保存到.mat文件中。
containers.Map
类不支持与数值数组相同的数组串联(部分原因是Map
类重载了一些数组访问函数)。因此,您不能生成Map
对象的数组(尽管在尝试垂直连接时缺少错误消息)。containers.Map
对象的单元格数组但是,您可以创建
Map
对象的单元格数组;您只需要注意语法。你已经很接近了,但我想这是你想要的:我们本可以用分号来垂直连接它们
a = [a; {dictA}]
单元格数组、
{}
和[]
我的想法是,}是也可以在单元数组上工作的串联操作。
{}
用于将内容放入单元格(也可以将它们取出),而{a = {}
将a
指定为空单元格数组。a = [a, {dictA}]
将dictA
放入一个单元格,然后将这个1x1单元格数组与单元格数组a
连接起来。a = [{a}, {dictA}]
将把a
放在另一个单元格数组中,导致您遇到一个奇怪的嵌套单元格数组。a{1}
返回单元格数组a
中第一个单元格的内容,在本例中是一个Map
对象。在我看来,单元数组和各种括号/括号的使用是学习MATLAB时最令人困惑的事情之一。
小心!这些都是浅显的复制品
注意,这个MATLAB称之为“handle类”,这意味着}都是指向同一对象的指针/引用。因此:
^{pr2}$a{1}
,a{2}
,和{请注意,所有3个尺寸都增加了。只是想提醒您,以防这与Python中的行为不同(我不知道Python中的行为是什么)。
相关问题 更多 >
编程相关推荐