MATLABのハッシュテーブル


92

MATLABはハッシュテーブルをサポートしていますか?


いくつかの背景

画像のスケール空間表現を必要とするMatlabの問題に取り組んでいます。これを行うにsigma*s^kk、ある範囲の分散を持つ2次元ガウスフィルターを作成します。次に、各フィルターを順番に使用して画像をフィルター処理します。さて、からkフィルタリングされた画像への何らかのマッピングが必要です。

k常に整数の場合、次のような3D配列を作成します。

arr[k] = <image filtered with k-th guassian>

ただし、kは必ずしも整数ではないため、これを行うことはできません。私が考えたのは、次kのようなsの配列を保持することでした。

arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>

最初の考えではかなり良いようですがk、20または30の値でこのルックアップを数千回実行する可能性があり、これによりパフォーマンスが低下するのではないかと心配しています。

O(n)ではなくO(1)のルックアップタイムが得られるように、ある種のハッシュテーブルを使用してこれを行うほうがよいのではないでしょうか。


今、私は時期尚早に最適化するべきではないことを知っており、私はこの問題をまったく持っていないかもしれませんが、これは単なる背景であり、それが私の問題の最善の解決策。

回答:


14

Matlabはハッシュテーブルをサポートしていません。編集 r2010aまで、つまり @Amroの回答を参照してください。

検索を高速化するにはfind、を削除し、LOGICAL INDEXINGを使用します。

arr{array_of_ks==k} = <image filtered with k-th Gaussian>

または

arr(:,:,array_of_ks==k) = <image filtered with k-th Gaussian>

ただし、Matlabでのすべての経験で、ルックアップがボトルネックになることはありませんでした。


特定の問題をスピードアップするには、増分フィルタリングを使用することをお勧めします

arr{i} = GaussFilter(arr{i-1},sigma*s^(array_of_ks(i)) - sigma*s^(array_of_ks(i-1)))

仮定は、array_of_ks昇順にソートし、GaussFilterは(もちろん、および使用、2つの1Dフィルタ)フィルタマスク分散に基づいてサイズを算出するか、拡大イメージのために特に有用であるフーリエ空間でフィルタリングすることができ、分散がある場合にされています等間隔に配置されます(残念ながらそうではありません)。


120

MATLABのマップクラス(containers.Map)の使用を検討してください。ここに簡単な概要があります:

  • 作成:

    >> keys = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', ...
      'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Annual'};
    
    >> values = {327.2, 368.2, 197.6, 178.4, 100.0,  69.9, ...
      32.3,  37.3,  19.0,  37.0,  73.2, 110.9, 1551.0};
    
    >> rainfallMap = containers.Map(keys, values)
    
    rainfallMap = 
      containers.Map handle
      Package: containers
    
      Properties:
            Count: 13
          KeyType: 'char'
        ValueType: 'double'
      Methods, Events, Superclasses
  • 調べる:

    x = rainfallMap('Jan');
  • 割当:

    rainfallMap('Jan') = 0;
  • 追加:

    rainfallMap('Total') = 999;
  • 削除する:

    rainfallMap.remove('Total')
  • 検査:

    values = rainfallMap.values;
    keys = rainfallMap.keys;
    sz = rainfallMap.size;
  • チェックキー:

    if rainfallMap.isKey('Today')
        ...
    end

7
うわぁ、知らなかった!+1。それらが論理インデックスよりもはるかに高速であるかどうかを知っていますか?
ジョナス

3
Containers.Mapは見MATLAB 7.7(R2008b)で追加されましたmathworks.com/access/helpdesk/help/techdoc/rn/brqyzax-1.html。R2010aの新機能は、キータイプと値タイプを指定するコンストラクターです。M = Containers.Map( 'KeyType'、kType、 'ValueType'、vType)
zellus

@Jonas:私は広範囲にそれらを使用していない、彼らが、ルックアップのための論理インデックスを使用してと比較方法を確認するために興味深いものになるだろう。..
アムロ

9
@ zellus、@ amro:Matlabのコマンドの履歴がないのは不愉快ではありませんか?
ジョナス

4
ルックアップ:雨量マップ( 'Jan'); 割り当て:雨量マップ( 'Jan')= 'ゼロ'; 検査:雨量マップ。値; 雨量マップ.keys; 雨量マップ。サイズ; キーを確認します。雨量マップ.isKey( 'Today');
エフゲニー・セルギーフ

26

Matlab R2008b(7.7)の新しいcontainer.Mapクラスは、java.util.MapインターフェースのMatlabバージョンを縮小したものです。これには、すべてのMatlabタイプ(JavaマップはMatlab構造体処理できないなど)とのシームレスな統合の利点と、Matlab 7.10(R2010a)以降のデータタイプ指定する機能があります

キーと値のマップ/辞書を必要とする深刻なMatlab実装は、JavaのMapクラス(java.util.EnumMapHashMapTreeMapLinkedHashMapまたはHashtable)を使用して、パフォーマンスではなくてもより大きな機能にアクセスする必要があります。R2008bより前のバージョンのMatlabには、いかなる場合でも実際の代替手段はなく、Javaクラスを使用する必要があります。

Javaコレクションの使用に関する潜在的な制限は、構造体などの非プリミティブなMatlab型を含めることができないことです。これを克服するには、型をダウンコンバートする(たとえば、struct2cellを使用するか、プログラムで)か、情報を保持する別のJavaオブジェクトを作成して、このオブジェクトをJavaコレクションに格納します。

Pure-Matlabオブジェクト指向(クラスベース)Hashtable実装を調べることもできます。 、File Exchangeで入手可能できます


1
今日投稿された別のMatlabクラスベースの実装:mathworks.com/matlabcentral/fileexchange/28586
Yair Altman

19

あなたはそれのためにjavaを使うことができました。

MATLABで:

dict = java.util.Hashtable;
dict.put('a', 1);
dict.put('b', 2);
dict.put('c', 3);
dict.get('b')

しかし、プロファイリングを行って速度が向上するかどうかを確認する必要があると思います...


12

これは少し扱いに​​くいですが、誰も構造体の使用を提案していないことに驚いています。struct.(var)where varは任意の変数であり、適切に解決されるため、変数名で任意の構造体フィールドにアクセスできます。

dict.a = 1;
dict.b = 2;

var = 'a';

display( dict.(var) ); % prints 1

1
あなたはフィールド名として番号を使用する場合は壊れる:dict.('2')mathworks.com/access/helpdesk/help/techdoc/matlab_prog/...
アムロ

また、変数は整数でなければなりません:dict.(['k',num2str(1)])機能しdict.(['k',num2str(1.1)])ますが、失敗します。値が整数の場合、それらを使用して直接インデックスを付けることができます。それ以外の場合は、これは良い考えです。
ジョナス

@ Amro、@ Jonas、公平なポイント、キーが整数の場合、このトリックを使用する必要はありません(配列の方が理にかなっています)...キーが任意のフロートの場合、これは少し難しいですが、私はD」接頭文字を持つと交換してください._
マークエリオット

6
構造体を使用して上記の問題は、フィールド名として追加する前に、文字列をvariabilizingすることで回避することができますdict.(genvarname(['k',num2str(1.1)]))
foglerit

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.