MATLAB表格是否消除了对字典的需求



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

我开始觉得我可以忘记使用字典了。有没有典型的情况是不可取的?

TL;DR:否。containers.Map具有无法用table替代的用途。我不会选择table作为字典。


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

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

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

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

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

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

  • 数据:它们都可以包含异构数据(每个值都有不同的类型),但如果执行此操作,table会更改索引方式(T.value(name)用于异构数据,T.value{name}用于异构数据)。

  • 语法:为了查找关键字,containers.Map提供了最直接的语法:M(name)。将table转换为字典需要毫无意义地使用列名:T.value(name)。如果关键字是由变量的内容给定的,那么struct看起来有点尴尬:S.(name)

  • 构造:(参见下面的代码。)containers.Map具有根据给定数据构建字典的最直接的方法。struct并非用于此目的,因此它变得很复杂。

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

  • 其他差异:

    • table显然可以包含多个列,并且有很多有趣的方法来处理数据。

    • stuct实际上是一个结构数组,可以被索引为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

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

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 

相关内容

  • 没有找到相关文章

最新更新