什么是MATLAB等价于Python中的dict列表?

2024-09-29 01:34:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在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]

Tags: namemapsizebytesmywithcellproperties
2条回答

一个可能的等效物是包含以下结构的单元:

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中最初的“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 = [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称之为“handle类”,这意味着a{1}a{2},和{}都是指向同一对象的指针/引用。因此:

^{pr2}$

请注意,所有3个尺寸都增加了。只是想提醒您,以防这与Python中的行为不同(我不知道Python中的行为是什么)。

相关问题 更多 >