finding distance within a range of distance
1 回表示 (過去 30 日間)
古いコメントを表示
[EDIT: 20110524 01:36 CDT - reformat, clarify - WDR]
Hi I have a matrix as follows.
I =
1 1 5 1 1 1 8
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 5 2 1 1 1
1 1 1 1 1 5 1
1 1 1 1 1 1 1
I need to know whether distances of value 5 with another 5 are in the range 3. Thanks in advance
0 件のコメント
採用された回答
Andrei Bobrov
2011 年 5 月 24 日
ij5 = find(I==5);
[i5 j5] = ind2sub(size(I),ij5);
out1 = [nchoosek(ij5,2) bsxfun(@(x,y)sqrt(diff(nchoosek(x,2),[],2).^2....
+diff(nchoosek(y,2),[],2).^2),i5,j5)];
[non,indout]=min(out1(:,3));
out = out1(indout,:);
in vector "out" the first Two members - the indices of matrix "I", the third distance between them
EDIT
out = out1(out1(:,3) <= 3,:)
EDIT EDIT
The answer to the last Mohammad comment:
[ii,jj]=ind2sub(size(I),nchoosek(find(I==5),2));
out1 = [ii jj sqrt(sum(reshape(diff([ii;jj],[],2).^2,[],2),2))];
[non,indout]=min(out1(:,5)); % 1 variant
out = out1(indout,:);
out = out1(out1(:,5) <= 3,:); % 2 variant
その他の回答 (1 件)
Wolfgang Schwanghart
2011 年 5 月 23 日
How about
[X,Y] = meshgrid(1:size(I,2),1:size(I,1));
ix = find(I == 5);
d = hypot(bsxfun(@minus,X(ix),X(ix)'),bsxfun(@minus,Y(ix),Y(ix)'));
[ixd,cc] = find(d<=3 & d>0);
II = false(size(I));
II(ix(ixd)) = true;
Cheers, W.
2 件のコメント
Walter Roberson
2011 年 5 月 24 日
Wolfgang's output matrix II has a 1 in each position at which there was originally a 5 that was within a distance of 3 of another 5.
If that output is not what you wanted, then you need to specify the form of the output that you did want.
参考
カテゴリ
Help Center および File Exchange で Resizing and Reshaping Matrices についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!