1

MATLABtable允许您使用行名(例如MyTable.FourthColumn('SecondRowName'). 与此相比,字典 ( containers.Map) 看起来很原始,例如,它充当 1 列表的角色。它还有自己的专用语法,这会减慢对如何编码的思考。

我开始认为我可以忘记字典的使用。是否存在不建议这样做的典型情况?

4

2 回答 2

3

TL;DR: No.containers.Map有不能用table. 我不会table为字典选择 a 。


containers.Maptable有许多值得注意的差异。它们各有各的用途。我们可以用来创建字典的第三个容器是struct.

要将 atable用作字典,您只需定义一列,并指定行名:

T = table(data,'VariableNames',{'value'},'RowNames',names);

以下是这些容器在用作字典时的一些显着差异:

  • 速度:struct目前访问速度最快(10 倍)。当以等效方式使用时(即具有行名的单列表)containers.Map,速度大约是 a 的两倍。table

  • 键:Astruct仅限于作为有效变量名的键,其他两个可以使用任何字符串作为键。键也可以是标containers.Map量数(浮点数或整数)。

  • 数据:它们都可以包含异构数据(每个值都有不同的类型),但是table如果这样做会改变索引的方式(T.value(name)对于同质数据,T.value{name}对于异构数据)。

  • 语法:要查找键,containers.Map提供最直接的语法:M(name). Atable变成字典需要毫无意义地使用列名:T.value(name). A struct,如果键是由变量的内容给出的,看起来有点尴尬:S.(name)

  • 构造:(参见下面的代码。)containers.Map具有从给定数据构建字典的最直接方法。struct不是为了这个目的,因此它变得复杂。

  • 内存:这很难比较,因为containers.Map它是在 Java 中实现的,因此whos只报告 8 个字节(即一个指针)。如果数据是同质的(所有值都具有相同的类型)和标量,则Atable 可以比 a 更节省内存struct,因为在这种情况下,一列的所有值都存储在单个数组中。

  • 其他区别:

    • Atable显然可以包含多个列,并且有很多有趣的方法来操作数据。

    • Astuct实际上是一个结构数组,可以索引为S(i,j).(name). 当然name可以是固定的,而不是变量,导致S(i,j).name. 在这三个中,这是唯一的内置类型,这就是它效率更高的原因。

下面是一些代码,显示了这三个容器在构造字典和查找值时的区别:

% Create names
names = cell(1,100);
for ii=1:numel(names)
   names{ii} = char(randi(+'az',1,20));
end
name = names{1};

% Create data
values = rand(1,numel(names));

% Construct
M = containers.Map(names,values);

T = table(values.','VariableNames',{'value'},'RowNames',names);

S = num2cell(values);
S = [names;S];
S = struct(S{:});

% Lookup    
M(name)
T.value(name)
S.(name)

% Timing lookup
timeit(@()M(name))
timeit(@()T.value(name))
timeit(@()S.(name))

计时结果(微秒):

M: 16.672
T: 23.393
S:  2.609
于 2018-12-31T08:18:07.953 回答
0

您可以更简单,您可以使用字符串字段访问结构:

clear
% define
mydata.('vec')=[2 4 1]; 
mydata.num=12.58;
% get 
select1='num'; 
value1=mydata.(select1); %method 1 
select2='vec'; 
value2=getfield(mydata,select2) %method 2 
于 2018-12-30T12:43:19.057 回答