我需要在Matlab中使用类似hashmap的功能,其中hashmap将矢量映射到其他矢量,并且事先不知道矢量的数量(范围数十万)。
我尝试了Matlab的内置Containers.Map,但这并不接受矢量作为键。然后我尝试了java.util.HashMap:
>> map = java.util.HashMap;
>> map.put(1:3,zeros(2,1));
>> map.get(1:3)
ans =
[]
因此,由于某些原因似乎不起作用,即使Java的HashMap应该能够将数组映射到数组。
另一种选择是保留两个单独的矩阵,一个用于键,一个用于值,并逐步增长。但是我不想真的想这样做,因为Matlab中逐渐增长的东西是痛苦的(即使是块大小增量等,例如here)。
问题: 1.为什么Java的HashMap不能在这里工作? 2.还有其他方法吗?
感谢。
答案 0 :(得分:4)
这是一个可以满足您需求的kludge。 。
map = java.util.HashMap;
key = java.util.Vector;
matKey = 1:3;
for nn=1:numel(matKey)
key.add(matKey(nn));
end
map.put(key,zeros(2,1));
map.get(key)
..无论如何,这是一个起点。
答案 1 :(得分:1)
我将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();
%pick a random vector
idx = ceil(rand()*numvec);
s1 = S(idx,:);
%put it in the map
matmap(char(s1)) = zeros(1,4);
for i=1:5*10^5
if i==10^3 tic; end %allow some time for getting up to speed before timing
%pick a random vector and put it in the map
idx = ceil(rand()*numvec);
s2 = S(idx,:);
matmap(char(s2)) = zeros(1,4);
%retrieve value of previous vector
v = matmap(char(s1));
%modify it randomly and put it back
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,:);
%also convert value to ArrayKey so we can retrieve it by ref -- saves a put
%operation
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秒内运行。 5分钟后HashMap方法没有完成,导致Matlab无法响应。
Edit2:我还尝试预先分配两个单独的矩阵并使用ismember
查找密钥。性能比HashMap差。
答案 2 :(得分:0)
我最近不得不处理类似的问题,不是使用矢量而是使用数组。
Matlab有一个函数mat2str函数,可以将矩阵转换为字符串。如果您不需要向量在HashMap中动态增长,则可以将向量表示为字符串并将其用作键/值。在某些情况下,这可能不是很有帮助,但如果事情是静态的,那么这是一个快速而肮脏的解决方案。