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 より劣っていました。