まず、私の問題の背景を少し説明します。
幾何学的ハッシュ手法を使用してオブジェクト認識システムを構築しています。私のハッシュテーブルは、基本トリプレットによって決定されるモデル内のポイントのアフィン座標によってインデックス付けされます (学習したオブジェクトのアフィン不変表現を可能にします)。各ハッシュ テーブル エントリは構造体です。
entry = struct('ModelName', modelName, 'BasisTriplet', [a; b; c])];
ここで、任意の基底トリプレットが画像ポイントから抽出され、他のすべてのポイントのアフィン座標がこの基底に対して計算され、ハッシュ テーブルのインデックスとして使用されます。このハッシュ ビンに存在するエントリごとに、modelName と基底トリプレットに対して投票が行われます。すべてのポイントをチェックした後、モデルとそれに対応する十分な投票数を持つ基底トリプレットがオブジェクトの候補として採用され、さらなる検証ステップが実行されます。
ただし、これらの投票を行う最も効率的な方法は何なのかはわかりません。現在、動的セル配列を使用しています。新しいモデルと基本トリプレットのペアが投票されるたびに、配列に追加の行が追加されます。それ以外の場合、既存の候補者の投票数が増加します。
for keylist = 1:length(keylist)
% Where keylist is an array of indicies to the relevant keys to look up
% xkeys is the n by 2 array of all of the keys in the hash table
% Obtain this hash bin
bin = hashTable(xkeys(keylist(i), 1), xkeys(keylist(i), 2));
% Vote for every entry in the bin
for entry = 1:length(bin)
% Find the index of this model/basis in the voting accumulator
indAcc = find( strcmp(bin.ModelName, v_models(:, 1)) & myIsEqual(v_basisTriplets, bin.BasisTriplet) );
if isempty(indAcc)
% If entries do not exist yet, Add new entries
v_models = [v_models; {bin.ModelName, 1}];
v_basisTriplets = cat(3, v_basisTriplets, bin.BasisTriplet);
else
% Otherwise increment the count
v_models(indAcc, 2) = v_models(indAcc, 2)+1;
end
end
end
別の 3D 配列 (v_basisTriplets) があり、2D 基底配列が連結され、3 次元に沿ってインデックスが付けられます。セル配列にもこれらの基底トリプレットがありましたが、このセル配列を 2D 配列で検索するのは困難でした。myIsEqual 関数は、3 番目の次元を検索し、各インデックスの 2D 配列が等しいかどうかをチェックし、検索で使用する配列が等しい 1D ベクトルを返します。
function ind = myIsEqual(vec3D, A)
ind = zeros(size(vec3D, 3), 1);
for i = 1:size(vec3D, 3)
ind(i) = isequal(vec3D(:, :, i), A);
end
これは確かに最も効率的な方法ではありません。すぐに、配列を初期化して事前に投票を保存する方が効率的であることがわかります。ただし、一般的にこれを行うためのより良い方法はありますか? 通常、何百ものチェックポイントがあり、時間は貴重であるため、最も効率的でエレガントな投票方法を見つける必要があります.
ありがとう