MATLAB表是否消除了对字典的需要?

时间:2018-12-30 05:05:10

标签: matlab dictionary matlab-table

MATLAB table使您可以使用行名称(例如MyTable.FourthColumn('SecondRowName'))索引到任何列/字段。与此相比,字典(containers.Map)看起来很原始,例如,它充当1列表的角色。它还具有自己的专用语法,这减慢了有关如何编码的思考。

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

2 个答案:

答案 0 :(得分:3)

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)用于同类数据,{{ 1}}(用于异构数据)。

  • 语法:要查找键,T.value{name}提供最直接的语法:containers.Map。将M(name)变成字典需要对列名table的无意义使用。 T.value(name)(如果键由变量的内容提供)看起来有点尴尬:struct

  • 构造:(请参见下面的代码。)S.(name)具有从给定数据构建字典的最简单方法。 containers.Map并非用于此目的,因此会变得很复杂。

  • 内存:这很难比较,因为struct是用Java实现的,因此containers.Map仅报告8个字节(即指针)。如果数据是同质的(所有值具有相同的类型)和标量,则whos 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))

答案 1 :(得分: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