2016-11-08 50 views
0

私が現在やっていることは、要素がお互いに近いかどうかを調べるために、ベクトル内のすべての要素間のユークリッド距離(要素は2D画像のピクセル位置です)を計算することです。私はベクトル内の各インデックスの値をインクリメンタルに取る参照ベクトルを作成します。基準ベクトルとピクセル位置ベクトルのすべての要素との間のユークリッド距離は、MATLAB関数 "pdist2"を使用して計算され、その結果がいくつかの条件に適用されます。しかし、コードを実行すると、この関数は計算に最も長くかかるようです(つまり、1回の実行で27,245回呼び出され、プログラム全体の実行時間の約54%に貢献しました)。これを行い、プログラムをスピードアップするより効率的な方法がありますか?乗ユークリッド距離についてはMATLAB:ユークリッド距離を効率的に計算するには?

[~, n] = size(xArray); %xArray and yArray are same size 
%Pair the x and y coordinates of the interest pixels 
pairLocations = [xArray; yArray].'; 
%Preallocate cells with the max amount (# of interest pixels) 
p = cell(1,n); 

for i = 1:n 
    ref = [xArray(i), yArray(i)]; 
    d = pdist2(ref,pairLocations,'euclidean'); 
    d = d < dTh; 
    d = find(d==1); 
    [~,k] = size(d); 
    if (k >= num) 
     p{1,i} = d; 
    end 
end 
+0

まず、 'pdist2'は行列を入力として得ることができます(forループのポイントである必要はありません)。しかし、あなたのコードから、私はあなたの参照ピクセルから1の距離を持つピクセルインデックスだけを検索したいと思います。だから、私は全体のソリューションは、単純に(xとyのインデックスから1を追加し、減算する)はるかに簡単かもしれないと思う... –

+0

私は、しきい値から1の距離を持つピクセルインデックスを検索しようとしていません。私は、ピクセルのインデックスの距離がリファレンスからの距離に対して特定の設定された閾値よりも小さいという条件(d = d

答えて

2

、行列の内積を使用してのトリックがある:

||a-b||² = <a-b, a-b> = ||a||² - 2<a,b> + ||b||² 

はその後C = [xArray; yArray];すべての場所の2×n行列、

n2 = sum(C.^2); % sq norm of coordinates 
D = bsxfun(@plus, n2, n2.') - 2 * C.' * C; 

ましょう今D(ii,jj)は、正方形を保持していますポイントiiとポイントjjの間の距離。 非常に速く実行する必要があります。

+0

@RodyOldenhuisあなたの編集に感謝します! – Shai

関連する問題