MATLABはハッシュテーブルをサポートしていますか?
画像のスケール空間表現を必要とするMatlabの問題に取り組んでいます。これを行うには、ある範囲のk
に対して分散sigma*s^k
を持つ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)であるルックアップ時間になるように、ある種のハッシュテーブルでこれを行う方が良いのではないかと思います。
今、私は時期尚早に最適化するべきではないことを知っており、この問題はまったくないかもしれませんが、これは単なる背景であり、それが本当にmy問題の最適なソリューション。
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フィルターを使用します)。または、フーリエ空間でフィルター処理できます。均等に間隔が空いています(残念ながらそうではありません)。
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
Matlab R2008b(7.7)の新しいcontainer.Mapクラスは Java.util.Map インターフェースの縮小されたMatlabバージョンです。すべてのMatlabタイプ( Java MapsはMatlab構造体を処理できない など)とのシームレスな統合、およびMatlab 7.10(R2010a)以降の機能 データ型の指定 =。
キーと値のマップ/ディクショナリを必要とするMatlabの深刻な実装では、引き続きJavaのMapクラスを使用する必要があります( Java.util.EnumMap 、 HashMap 、 TreeMap 、- LinkedHashMap または Hashtable )パフォーマンスでない場合、より大きな機能へのアクセスを取得します。 R2008bより前のMatlabバージョンには、いかなる場合でも実際の代替手段がなく、Javaクラスを使用する必要があります。
Javaコレクションを使用することの潜在的な制限は、構造体などの非プリミティブMatlab型を含めることができないことです。これを克服するには、型をダウンコンバートします(たとえば、struct2cellまたはプログラムを使用して)、または情報を保持する別のJavaオブジェクトを作成し、このオブジェクトをJavaコレクションに保存します。
File Exchangeで利用可能 である、純粋なMatlabのオブジェクト指向(クラスベース)Hashtable実装を調べることもできます。
Javaを使用できます。
Matlabで:
dict = Java.util.Hashtable;
dict.put('a', 1);
dict.put('b', 2);
dict.put('c', 3);
dict.get('b')
ただし、プロファイリングを実行して、速度が向上するかどうかを確認する必要があります...
それは少し手ごわいですが、誰も構造体の使用を提案していないことに驚いています。構造体フィールドには、struct.(var)
のように変数名でアクセスできます。var
は任意の変数であり、適切に解決されます。
dict.a = 1;
dict.b = 2;
var = 'a';
display( dict.(var) ); % prints 1
新しいタイプの「テーブル」を利用することもできます。さまざまなタイプのデータを保存し、そこから統計を簡単に取得できます。詳細については、 http://www.mathworks.com/help/matlab/tables.html を参照してください。