1. ホーム
  2. matlab

[解決済み] MATLABのハッシュテーブル

2023-03-17 03:22:10

質問

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


いくつかの背景

私はMatlabで、画像のスケール空間表現を必要とする問題に取り組んでいます。これを行うために、私は分散が sigma*s^k に対して k をある範囲に分割し、それぞれを順番に使って画像にフィルタをかけています。 さて、私は、ある種のマッピングが欲しいのです。 k からフィルタリングされた画像へのマッピングが必要です。

もし k が常に整数であれば、単純にそのような3D配列を作成します。

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

しかし k が整数であるとは限らないので、これはできない。 そこで思いついたのが k をそのような配列にしておくことです。

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

これは一見とても良いように見えますが、このルックアップを潜在的に数千回行う可能性があり、20から30の値の k の値でこのルックアップを潜在的に何千回も行うことになり、これがパフォーマンスに影響を与えることを懸念しています。

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


今、私は時期尚早に最適化すべきではないことを知っていますし、この問題はまったくないかもしれませんが、これは背景に過ぎず、これが本当に最善の解決策であるケースがあるかもしれないことを覚えておいてください。 私の の問題に対する最善の解決策であるかどうかにかかわらず、これが本当に最善の解決策である場合があることを忘れないでください。

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

Matlabはハッシュテーブルをサポートしていません. EDIT r2010a までは、です。 アムロ の回答を見てください。

検索を高速化するために、以下のように find を削除して 論理インデックス .

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つの1次元フィルタを使用します)。また、フーリエ空間でフィルタリングすることもでき、これは特に大きな画像や分散が等間隔である場合(残念ながらそうではない場合がほとんどですが)に有用です。