我想了解容器贴图和matlab中的结构之间的区别。
从我看来,似乎容器映射的优点是它可以使用任何数字或字符串作为键,而struct字段只能接受作为合法变量名称的字符串(例如它不接受mystruct.('123string')
)
在结构上使用容器映射还有其他优点吗?
由于
答案 0 :(得分:8)
容器映射和结构背后的概念完全不同:
容器映射用于创建映射或索引。例如,如果您有一个矩阵A
并希望索引第二行和第二列中的元素,则将使用A(2,2)
对其进行索引。对于数字,矩阵等,您希望索引特定行号,这很方便。但是,假设您的情况如下例Mathworks所示:
这里有一组值,您可以在1月份将其编入value(1)
,依此类推。然而,这不是很清晰。如果你可以用value('Jan')
索引它会更方便。这正是容器地图提供的内容。正如@marsei在评论中所说,容器映射是一种基于Java的无序构造,它使用散列表进行索引。
结构是一个不同的结构,它是基于C的并且是有序的(感谢没有的@marsei)。 struct的主要用途是帮助您以更合理的方式存储数据。例如,使用图像时,通常有两个变量:一个用于图像数据,另一个用于颜色图。如果没有结构,则需要在工作区中保留这两个单独的变量。对于多个图像,这会非常混乱(例如使用img0_data
,img0_map
之类的名称等等。结构可以帮助您以一种简单的方式组织它:一个名为img0
的结构,其中包含字段data
和map
。
在字典的上下文中,两种结构或多或少都是等价的,尽管结构通常看起来比容器映射更快。另外,正如问题中已经提到的,容器映射的key
可以是任何单个值,而对于结构,它必须是字符串。
答案 1 :(得分:2)
在阅读了@ hbaderts的回答之后,它让我想知道速度差实际是什么。因此,我继续尝试了一些基准测试。
%% Below is to test read/write speed of struct, hashMap, and hashMap matrix assignment
numTrials= 10;
numKeys= 10000;
hw= zeros(1,numTrials);
hr= zeros(1,numTrials);
hmw= zeros(1,numTrials);
hmr= zeros(1,numTrials);
sw= zeros(1,numTrials);
sr= zeros(1,numTrials);
str= cell(1,numTrials);
for z= 1:numTrials
for e=1:numKeys
str{e}= strcat('adc',num2str(e));
end
% HashMap write
tic;
m= containers.Map();
for a=1:numKeys
m(str{a})=str{a};
end
hw(z)= toc;
% HashMap read
tic;
for b=1:numKeys
m(str{b});
end
hr(z)= toc;
% HashMap matrix write
tic;
keyval= cell(numKeys,1);
for a=1:numKeys
keyval{a}=str{a};
end
mm= containers.Map(keyval,keyval);
hmw(z)= toc;
% HashMap matrix read
tic;
for b=1:numKeys
mm(str{b});
end
hmr(z)= toc;
% Struct write
tic;
s= struct();
for c=1:numKeys
s.c.s.x.(str{c})= str{c};
end
sw(z)= toc;
% Struct read
tic;
for d=1:numKeys
s.c.s.x.(str{d});
end
sr(z)= toc;
end
fprintf('hashmap read time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(hr)/numTrials,max(hr));
fprintf('hashmap write time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(hw)/numTrials,max(hw));
fprintf('hashmap matrix read time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(hmr)/numTrials,max(hmr));
fprintf('hashmap matrix write time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(hmw)/numTrials,max(hmw));
fprintf('struct read time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(sr)/numTrials,max(sr));
fprintf('struct write time\n avg: %.3f seconds\n max: %.3f seconds\n',sum(sw)/numTrials,max(sw));
结果:
hashmap read time
。
最大:0.320秒。
hashmap write time
。
最大:0.247秒。
hashmap matrix read time
。
最大:0.323秒。
hashmap matrix write time
。
平均值:0.011秒。
最大:0.016秒。
struct read time
。
最大值:0.066秒。
struct write time
。
最大值:0.046秒。
如果此测试看起来有效,请告诉我!