web-dev-qa-db-ja.com

MATLABのハッシュテーブル

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


いくつかの背景

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

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

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

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

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

これは最初の考えではかなり良いように思えますが、kの約20または30の値でこの検索を数千回行う可能性があり、これがパフォーマンスを損なうことを恐れています。

O(n)ではなくO(1)であるルックアップ時間になるように、ある種のハッシュテーブルでこれを行う方が良いのではないかと思います。


今、私は時期尚早に最適化するべきではないことを知っており、この問題はまったくないかもしれませんが、これは単なる背景であり、それが本当にmy問題の最適なソリューション。

87
Nathan Fellman

Matlabはハッシュテーブルをサポートしていません。 [〜#〜] edit [〜#〜]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でのすべての経験において、私はneverルックアップがボトルネックになっていた。


特定の問題を高速化するには、インクリメンタルフィルタリングを使用することをお勧めします

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フィルターを使用します)。または、フーリエ空間でフィルター処理できます。均等に間隔が空いています(残念ながらそうではありません)。

14
Jonas

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
    
118
Amro

Matlab R2008b(7.7)の新しいcontainer.Mapクラスは Java.util.Map インターフェースの縮小されたMatlabバージョンです。すべてのMatlabタイプ( Java MapsはMatlab構造体を処理できない など)とのシームレスな統合、およびMatlab 7.10(R2010a)以降の機能 データ型の指定 =。

キーと値のマップ/ディクショナリを必要とするMatlabの深刻な実装では、引き続きJavaのMapクラスを使用する必要があります( Java.util.EnumMapHashMapTreeMap 、- LinkedHashMap または Hashtable )パフォーマンスでない場合、より大きな機能へのアクセスを取得します。 R2008bより前のMatlabバージョンには、いかなる場合でも実際の代替手段がなく、Javaクラスを使用する必要があります。

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

File Exchangeで利用可能 である、純粋なMatlabのオブジェクト指向(クラスベース)Hashtable実装を調べることもできます。

25
Yair Altman

Javaを使用できます。

Matlabで:

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

ただし、プロファイリングを実行して、速度が向上するかどうかを確認する必要があります...

18
tauran

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

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

var = 'a';

display( dict.(var) ); % prints 1
12
Mark Elliot

新しいタイプの「テーブル」を利用することもできます。さまざまなタイプのデータを保存し、そこから統計を簡単に取得できます。詳細については、 http://www.mathworks.com/help/matlab/tables.html を参照してください。

1
Lei Zhang