我将 containers.Map 与 char 键(感谢 Andrew Janke)与使用包装对象作为键的 java.util.HashMap 进行了比较(如 this post 所示,同样感谢 Andrew Janke,并感谢 Rasman 指出):
numvec = 10^5;
S = round(rand(numvec,10)*40);
matmap = containers.Map();
idx = ceil(rand()*numvec);
s1 = S(idx,:);
matmap(char(s1)) = zeros(1,4);
for i=1:5*10^5
if i==10^3 tic; end
idx = ceil(rand()*numvec);
s2 = S(idx,:);
matmap(char(s2)) = zeros(1,4);
v = matmap(char(s1));
v( ceil(rand()*4) ) = rand();
matmap(char(s1)) = v;
s1 = s2;
end
toc
javaaddpath('/Test/bin');
import test.ArrayKey;
javmap = java.util.HashMap;
idx = ceil(rand()*numvec);
s1 = S(idx,:);
javmap.put(ArrayKey(s1), ArrayKey(zeros(1,4)));
for i=1:5*10^5
if i==10^3 tic; end
idx = ceil(rand()*numvec);
s2 = S(idx,:);
javmap.put(ArrayKey(s2), ArrayKey(zeros(1,4)));
v = javmap.get(ArrayKey(s1));
v.x( ceil(rand()*4) ) = rand();
s1 = s2;
end
toc
结果:
>> testmaps
Elapsed time is 58.600282 seconds.
Elapsed time is 97.617556 seconds.
containers.Map是胜者。
编辑:我重新运行了numvec = 10 ^ 6的测试,其他都相同。使用containers.Map方法运行时间为59秒。使用HashMap方法在5分钟后仍未完成,并导致Matlab无响应。
编辑2:我还尝试了预先分配两个矩阵并使用ismember
查找键。性能比HashMap差。
typecast
不会进行四舍五入或扩展,它将精确保留底层位模式,只是将它们重新打包成新的数组类型。例如,如果您有一个double
x,执行typecast(x,'uint16')
将返回一个4个元素的uint16
数组,其值看起来与x
表示的数字完全不同。但这是一种无损转换。对于给定输入类型的任何两个不同数字,在类型转换后都会产生不同的结果。 - Andrew Janke