5

ハッシュマップがベクトルを他のベクトルにマップし、ベクトルの数 (数十万の範囲) が事前にわかっていない、Matlab でハッシュマップのような機能が必要です。

Matlab の組み込みのContainers.Mapを試しましたが、ベクトルをキーとして受け入れません。次に、java.util.HashMap を試しました。

>> map = java.util.HashMap;
>> map.put(1:3,zeros(2,1));
>> map.get(1:3)

 ans =

 []

したがって、Java の HashMap は配列を配列にマップできるはずですが、何らかの理由で機能しないようです。

もう 1 つのオプションは、キー用と値用の 2 つの個別のマトリックスを保持し、それらを段階的に拡大することです。しかし、私は本当にそれをしたくありません.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: また、2 つの別個のマトリックスを事前に割り当て、 を使用してキーを見つけようとしismemberました。パフォーマンスは HashMap より劣っていました。

于 2012-10-10T11:39:36.810 に答える