mxn
の行列にE
の非ゼロ要素があります。 nonzerosの座標はすでにEx2
ベクトルで利用可能です。行列の要素をユークリッド距離で削除する
すべての非ゼロ要素のペア間の最小ユークリッド距離が少なくともd
であるかどうかを確認したいと思います。そして、これが当てはまらないところで、私はいくつかの要素をゼロにすることによってそれを強制したいと思います(要素を正確には関係ない)。
Matlabでこれを行うためのエレガントな方法はありますか?
mxn
の行列にE
の非ゼロ要素があります。 nonzerosの座標はすでにEx2
ベクトルで利用可能です。行列の要素をユークリッド距離で削除する
すべての非ゼロ要素のペア間の最小ユークリッド距離が少なくともd
であるかどうかを確認したいと思います。そして、これが当てはまらないところで、私はいくつかの要素をゼロにすることによってそれを強制したいと思います(要素を正確には関係ない)。
Matlabでこれを行うためのエレガントな方法はありますか?
% 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;
として結果のサンプルを追加しました
現在のところ問題を解決するには、有効なアプローチが多数あります。適切なものを選択することは、データの実際の性質と、それを薄くするために使用するロジックに依存します。
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;
あなたはここから行うまさにあなた次第です。あなたが本当にそれをオフに仕上げる方法を理解できない場合は、コメントに投稿してください。
他のアプローチは、完全に一つ以上のbwmorph
の、bwdist
、watershed
、delaunay
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');
ちょうど興味深いですが、ディスク構造要素はここでは「ユークリッド距離」を表していますか?この場合、幾何学的円とデジタルの円を同じにすることができますか? –
@ElijahRockers - 私はあなたが何を意味するか正確には分かりません。 'strel'のドキュメントはオンラインです(' here'')(http://uk.mathworks.com/help/images/ref/strel-class.html) 。ここで書いたように、±0.5ピクセルの問題があるかもしれません。実際には、このアプローチでは精度をsub sqrt(2)にすることはできません。答えの正確さは、OPがどのようにサブピクセルの距離を定義したいかによって決まると思います。 –
私は精密な問題は、自分の考えを明確にしてくれたことを指摘していたと思いました –
ランダム要素で始めることができると言うと、3つの要素(A =(1,5)、B =(1,7)、C =(1,9)最小距離はあなたが気にしない「3」でなければならない要素「AとC」または「Aのみ」、「B」のみ、または「C」のみを保持しますか? – beaker
重複しているわけではありませんが、delaunay三角測量を説明するこの古い回答を参照してください:http://stackoverflow.com/a/36653085/1401351 – Peter
後で私のデータにいくつかの重み付けを追加する予定でした。最初のアプローチでは、点Aから始まり、Bを取り除き、最短距離よりも上にあるようにCを維持する。 –