在Matlab中增长向量的Hashmap

时间:2012-10-09 17:43:25

标签: java matlab hashmap hashtable

我需要在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.还有其他方法吗?

感谢。

3 个答案:

答案 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中动态增长,则可以将向量表示为字符串并将其用作键/值。在某些情况下,这可能不是很有帮助,但如果事情是静态的,那么这是一个快速而肮脏的解决方案。