MATLAB 表格是否消除了对字典的需求?
Do MATLAB tables remove the need for dictionaries?
MATLAB table
s 允许您使用行名称索引任何 column/field,例如 MyTable.FourthColumn('SecondRowName')
。与此相比,字典 (containers.Map
) 显得原始,例如,它充当 1-column table 的角色。它还具有自己专用的语法,这会减慢对如何编码的思考。
我开始觉得我可以忘记使用字典了。是否存在不建议这样做的典型情况?
你可以更简单,你可以使用字符串字段访问结构:
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
TL;DR: 不。containers.Map
的用途无法用 table
代替。而且我不会选择 table
作为字典。
containers.Map
和 table
有许多值得注意的差异。他们各有各的用处。我们可以用来创建字典的第三个容器是 struct
.
要将 table
用作字典,您只需定义一列,并指定行名称:
T = table(data,'VariableNames',{'value'},'RowNames',names);
以下是这些容器用作字典时无table的区别:
速度:struct
具有迄今为止最快的访问速度 (10x)。 containers.Map
在以等效方式使用时(即具有行名称的单列 table)大约是 table
的两倍。
键:一个struct
仅限于为有效变量名的键,其他两个可以使用任何字符串作为键。 containers.Map
键也可以是标量数(浮点数或整数)。
数据:它们都可以包含异构数据(每个值都有不同的类型),但是如果你这样做 table
会改变你索引的方式(T.value(name)
对于同质数据数据,T.value{name}
用于异构数据)。
语法:要查找密钥,containers.Map
提供了最直接的语法:M(name)
。将 table
转换为字典需要毫无意义地使用列名:T.value(name)
。一个struct
,如果key是由一个变量的内容给出的,看起来有点别扭:S.(name)
.
构造:(参见下面的代码。)containers.Map
具有从给定数据构建字典的最直接方法。 struct
不是为了这个目的,因此它变得复杂。
内存:这很难比较,因为 containers.Map
在 Java 中实现,因此 whos
仅报告 8 个字节(即指针)。 table
可以 比 struct
的内存效率更高,如果数据是同质的(所有值都具有相同的类型)和标量,如本例中所有一列的值存储在一个数组中。
其他差异:
一个table
显然可以包含多个列,并且有很多有趣的方法来操作数据。
一个stuct
实际上是一个struct数组,可以索引为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
MATLAB table
s 允许您使用行名称索引任何 column/field,例如 MyTable.FourthColumn('SecondRowName')
。与此相比,字典 (containers.Map
) 显得原始,例如,它充当 1-column table 的角色。它还具有自己专用的语法,这会减慢对如何编码的思考。
我开始觉得我可以忘记使用字典了。是否存在不建议这样做的典型情况?
你可以更简单,你可以使用字符串字段访问结构:
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
TL;DR: 不。containers.Map
的用途无法用 table
代替。而且我不会选择 table
作为字典。
containers.Map
和 table
有许多值得注意的差异。他们各有各的用处。我们可以用来创建字典的第三个容器是 struct
.
要将 table
用作字典,您只需定义一列,并指定行名称:
T = table(data,'VariableNames',{'value'},'RowNames',names);
以下是这些容器用作字典时无table的区别:
速度:
struct
具有迄今为止最快的访问速度 (10x)。containers.Map
在以等效方式使用时(即具有行名称的单列 table)大约是table
的两倍。键:一个
struct
仅限于为有效变量名的键,其他两个可以使用任何字符串作为键。containers.Map
键也可以是标量数(浮点数或整数)。数据:它们都可以包含异构数据(每个值都有不同的类型),但是如果你这样做
table
会改变你索引的方式(T.value(name)
对于同质数据数据,T.value{name}
用于异构数据)。语法:要查找密钥,
containers.Map
提供了最直接的语法:M(name)
。将table
转换为字典需要毫无意义地使用列名:T.value(name)
。一个struct
,如果key是由一个变量的内容给出的,看起来有点别扭:S.(name)
.构造:(参见下面的代码。)
containers.Map
具有从给定数据构建字典的最直接方法。struct
不是为了这个目的,因此它变得复杂。内存:这很难比较,因为
containers.Map
在 Java 中实现,因此whos
仅报告 8 个字节(即指针)。table
可以 比struct
的内存效率更高,如果数据是同质的(所有值都具有相同的类型)和标量,如本例中所有一列的值存储在一个数组中。其他差异:
一个
table
显然可以包含多个列,并且有很多有趣的方法来操作数据。一个
stuct
实际上是一个struct数组,可以索引为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