finding distance within a range of distance
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
[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 Commenti
Risposta accettata
Andrei Bobrov
il 24 Mag 2011
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
Più risposte (1)
Wolfgang Schwanghart
il 23 Mag 2011
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 Commenti
Walter Roberson
il 24 Mag 2011
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.
Vedere anche
Categorie
Scopri di più su GPU Computing in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!