5

我在 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 中增量增长的痛苦(即使是块大小增量等,例如这里)。

问题: 1. 为什么Java的HashMap在这里不起作用?2. 还有其他方法吗?

谢谢。

4

3 回答 3

4

这是一个可以做你想做的事情。. .

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)

..无论如何,这是一个起点。

于 2012-10-09T18:37:01.660 回答
1

我将带有 char 键的 container.Map(感谢 Andrew Janke)与带有包装器对象作为键的 java.util.HashMap 进行了比较(在这篇文章中,也感谢 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.

container.Map 是赢家。


编辑:我重新运行了 numvec = 10^6 的测试,其他一切都一样。container.Map 方法在 59 秒内运行。HashMap 方法在 5 分钟后未完成,导致 Matlab 无响应。


Edit2:我还尝试预先分配两个单独的矩阵并使用ismember. 性能比 HashMap 差。

于 2012-10-10T11:39:36.810 回答
0

我最近不得不处理一个类似的问题,不是向量而是数组。

Matlab 有一个函数 mat2str 函数,可以将矩阵转换为字符串。如果您不需要向量在 HashMap 中动态增长,则可以将向量表示为字符串并将其用作键/值。在某些情况下,这可能不是很有帮助,但如果事情是静态的,它是一个快速而肮脏的解决方案。

于 2013-07-02T15:59:59.793 回答