16

重複の可能性:
MATLAB のハッシュ テーブル

一般的な質問

Matlabでハッシュセットまたはハッシュマップ構造を取得する方法はありますか?

一意のエントリを見つけたり、ベクトルのメンバーシップを確認したりする必要があり、unique()または論理インデックスなどのコマンドを使用すると、ベクトルを検索するように見え、大きな値のセットでは非常に遅い状況に陥ることがよくあります。Matlabでこれを行う最良の方法は何ですか?

たとえば、素数のリストがあり、3 が素数かどうかを確認したいとします。

primes = [2,3,5,7,11,13];

if primes(primes==3)
    disp('yes!')
else
    disp('no!')
end

長いベクトルでこれを行うと、何度も物事が本当に遅くなります。

他の言語では

基本的に、Matlab にはpython のset()and dict()、または同様に Java のjava.util.HashSetandに相当するものはありますか? java.util.HashMapそうでない場合、大きなベクトルでルックアップを行う良い方法はありますか?

編集:答えの考察

これは、回答の提案で得た実行時間です。

>> b = 1:1000000;
>> tic; for i=1:100000, any(b==i);; end; toc
Elapsed time is 125.925922 seconds.

s = java.util.HashSet();
>> for i=1:1000000, s.add(i); end    
>> tic; for i=1:100000, s.contains(i); end; toc
Elapsed time is 25.618276 seconds.

>> m = containers.Map(1:1000000,ones(1,1000000));
>> tic; for i=1:100000, m(i); end; toc
Elapsed time is 2.715635 seconds

Java セットの構築も非常に遅かったため、問題によってはこれも非常に遅くなる可能性があります。コンテナについて本当にうれしいです。地図のヒント。それは他の例を本当に破壊し、セットアップも瞬時でした.

4

2 に答える 2

20

このような?

>> m = java.util.HashMap;
>> m.put(1,'hello,world');
>> m.get(1)
ans =
hello, world

または、Matlabネイティブの実装が必要な場合は、

>> m = containers.Map;
>> m('one') = 1;
>> m('one')
ans =
     1

これは実際に入力されます-受け入れるキーはタイプのキーのみcharです。マップを作成するときに、キーと値のタイプを指定できます。

>> m =  containers.Map('KeyType','int32','ValueType','double');
>> m(1) = 3.14;
>> m(1)
ans =
  3.14

int32以外のキーと。以外の値を入力しようとすると、エラーが発生するようになりましたdouble

セットも利用できます。

>> s = java.util.HashSet;
>> s.put(1);
>> s.contains(1)
ans = 
     1
>> s.contains(2)
ans = 
     0
于 2012-09-27T16:18:56.870 に答える
1

あなたの例がどれほど文字通りであるかにもよりますが、これdispは膨大なオーバーヘッドになります (I/O は非常に遅いです)。

それはさておき、このようなチェックを行う最も簡単な方法は次のとおりだと思います。

if find(primes==3,1,'first')
    disp('yes');
else
    disp('no');
end

Edit、使用することもできますany(primes==3)-簡単な速度テストでは、それらがほぼ同等であることを示しています:

>> biglist = 1:100000;
>> tic;for i=1:10000
find(biglist==i,1,'first');
end
toc
Elapsed time is 1.055928 seconds.

>> tic;for i=1:10000
any(biglist==i);
end
toc
Elapsed time is 1.054392 seconds.
于 2012-09-27T16:16:37.810 に答える