1. ホーム
  2. matlab

[解決済み] matlabでhashtables/hashmapsを使う方法はありますか?重複

2022-02-12 17:24:56

質問

<ブロッククオート

重複の可能性があります。
MATLABのハッシュテーブル

一般的な質問

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

私はよく、ユニークなエントリを見つけたり、ベクトルのメンバーシップをチェックする必要がある状況で、以下のようなコマンドを使用することに気づきました。 unique() または論理的な索引付けは、ベクトルを通して検索するようで、大きな値のセットでは本当に遅いです。Matlabでこれを行う最良の方法は何でしょうか?

例えば、素数のリストがあり、3が素数かどうか調べたいとします。

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

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

長いベクトルで何度もやると、本当に遅くなるんです。

他の言語では

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

編集:回答への反映

これは、回答で提案されたことについて私が得た実行時間です。

>> 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セットの構築もかなり遅かったので、問題によってはこれもかなり遅くなるかもしれません。containers.Mapのヒントが本当にうれしいです。他の例を見事に打ち破ってくれましたし、セットアップもあっという間でした。

どのように解決するのか?

こんな感じ?

>> 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 .

また、Setsも用意されていますね。

>> s = java.util.HashSet;
>> s.put(1);
>> s.contains(1)
ans = 
     1
>> s.contains(2)
ans = 
     0