2016-05-02 16 views
2

mxnの行列にEの非ゼロ要素があります。 nonzerosの座標はすでにEx2ベクトルで利用可能です。行列の要素をユークリッド距離で削除する

すべての非ゼロ要素のペア間の最小ユークリッド距離が少なくともdであるかどうかを確認したいと思います。そして、これが当てはまらないところで、私はいくつかの要素をゼロにすることによってそれを強制したいと思います(要素を正確には関係ない)。

Matlabでこれを行うためのエレガントな方法はありますか?

+2

ランダム要素で始めることができると言うと、3つの要素(A =(1,5)、B =(1,7)、C =(1,9)最小距離はあなたが気にしない「3」でなければならない要素「AとC」または「Aのみ」、「B」のみ、または「C」のみを保持しますか? – beaker

+0

重複しているわけではありませんが、delaunay三角測量を説明するこの古い回答を参照してください:http://stackoverflow.com/a/36653085/1401351 – Peter

+0

後で私のデータにいくつかの重み付けを追加する予定でした。最初のアプローチでは、点Aから始まり、Bを取り除き、最短距離よりも上にあるようにCを維持する。 –

答えて

0

はあなたのための簡単なコード:) である私は、画像enter image description here

% Initialise the constants 
d = 0.1; % Distance Threshold 
E = rand(20,2); % Random Mx2 matrix of x and y coordinates 

% Display initial matrix 
fig1 = figure; 
Ex = E(:,1); 
Ey = E(:,2); 
scatter(Ex, Ey); 

% Repeat each coordinate to form a square matrix 
ExRep = repmat(Ex, 1, length(Ex)); 
EyRep = repmat(Ey, 1, length(Ey)); 

% Calculate the distance between every set of points 
distX = ExRep - ExRep'; 
distY = EyRep - EyRep'; 
distAll = sqrt(distX.^2 + distY.^2); 

% Display the distance between every set of points 
figure; 
imagesc(distAll); 
colormap('gray') 
title('Grid of distance from each points'); 

% Find the points that are at less then a certain distance 
smallDist = distAll < d; 
figure; 
imagesc(smallDist); 
colormap('gray') 
title('Grid of points with small distance neighbour'); 

% Find the points with no near neighbours 
numNearNeighbour = (sum(smallDist) - 1); 
noNearNeighbour = numNearNeighbour == 0; 
E2 = E; 
E2(noNearNeighbour, :) = []; 


% Display the new matrix 
figure(fig1); 
hold all; 
Ex2 = E2(:,1); 
Ey2 = E2(:,2); 
scatter(Ex2, Ey2, 'marker', '*'); 
legend({'all points', ['points with neighbours distance < ' num2str(d)]}, 'location', 'northoutside'); 
hold off; 
として結果のサンプルを追加しました
2

現在のところ問題を解決するには、有効なアプローチが多数あります。適切なものを選択することは、データの実際の性質と、それを薄くするために使用するロジックに依存します。

1つの「ピクセル」が半径dの円になるように、各非ゼロ要素を拡大するのが簡単なアプローチです。あまりにも接近しすぎるピクセルは、それらの接続された円によって明白になります。

E = rand(100)<0.001; % dummy boolean data 
d = 6; 

E_dilated = imdilate(E, strel('disk', d, 0)); 
E_dilated_labeled = bwlabel(E_dilated); 
E_labeled = E_dilated_labeled; 
E_labeled(~E) = 0; 

3 plots showing output

あなたはここから行うまさにあなた次第です。あなたが本当にそれをオフに仕上げる方法を理解できない場合は、コメントに投稿してください。

他のアプローチは、完全に一つ以上のbwmorphの、bwdistwatersheddelaunay triangulation、そしておそらくk-meansまたはagglomerative hierarchical clustering、または何か他のものを使用することがあります。

マップ上のマーカーとしてゼロ以外のエントリが考えられる場合、この問題はマッピングアプリケーションではかなり一般的です。 Google Maps APIには、さまざまなオプションについてのがあります。


プロットは、次の余分なコードを使用して製造された:ここでは

subplot(3,1,1); 
imshow(ind2rgb(E, gray(2))); axis image 
title('E (as Boolean)'); 
subplot(3,1,2); 
im = ind2rgb(E_dilated_labeled, lines(max(E_dilated_labeled(:)+1))); 
im(repmat(~E_dilated_labeled, [1,1,3])) = 0; 
imshow(im); axis image; 
title('E\_dilated\_labeled'); 
subplot(3,1,3); 
im = ind2rgb(E_labeled, lines(max(E_labeled(:)+1))); 
im(repmat(~E_labeled, [1,1,3])) = 0; 
imshow(im); axis image; 
title('E\_labeled'); 
+0

ちょうど興味深いですが、ディスク構造要素はここでは「ユークリッド距離」を表していますか?この場合、幾何学的円とデジタルの円を同じにすることができますか? –

+1

@ElijahRockers - 私はあなたが何を意味するか正確には分かりません。 'strel'のドキュメントはオンラインです(' here'')(http://uk.mathworks.com/help/images/ref/strel-class.html) 。ここで書いたように、±0.5ピクセルの問題があるかもしれません。実際には、このアプローチでは精度をsub sqrt(2)にすることはできません。答えの正確さは、OPがどのようにサブピクセルの距離を定義したいかによって決まると思います。 –

+0

私は精密な問題は、自分の考えを明確にしてくれたことを指摘していたと思いました –

関連する問題