if condition in for loop

3 次查看(过去 30 天)
Naga A
Naga A 2015-9-21
Hello ,
I have a problem in finding the same rows between two matrices. I wrote the code as follows
function neigh_no = neigh_search(hex_center,neigh)
[~, n] =size(hex_center);
[~, n1]= size(neigh);
if(n~=n1)
neigh=neigh';
end
neigh_no=[];
for i=1:length(hex_center)
for j=1:length(neigh)
if hex_center(i,:)== neigh(j,:)
neigh_no=[neigh_no i];
end
end
end
end
Suppose if the hex_center array values are
0 0
0 1.7320
0 3.4641
0 5.1961
3 0
3 1.7320
3 3.4641
3 5.1961
6 0
6 1.7320
6 3.4641
6 5.1961
9 0
9 1.7320
9 3.4641
9 5.1961
1.5 0.8660
1.5 2.5980
1.5 4.3301
4.5 0.8660
4.5 2.5980
4.5 4.3301
7.5 0.8660
7.5 2.5980
7.5 4.33012
and the neigh values are
9 5.1961
7.5 6.0621
6 5.1961
6 3.4641
7.5 2.5980
9 3.4641
if you observe that the rows 11,12,15,16 and 24 in hex_center matrix has same rows in the second matrix. But in the output it displays only the rows 11 and 15.Can you please help me? its so important> I know its simple. But I dont know where I did mistake.

回答(2 个)

Image Analyst
Image Analyst 2015-9-21
That usually doesn't work for floating point numbers, just integers and inverse powers of 2. You'll have to check for a tolerance like the code examples in the FAQ show you how to do: http://matlab.wikia.com/wiki/FAQ#Why_is_0.3_-_0.2_-_0.1_.28or_similar.29_not_equal_to_zero.3F
  2 个评论
Naga A
Naga A 2015-9-22
Thanks for the help.
Should I use the following condition in the if
areEssentiallyEqual = abs(hex_center(i,:)-neigh(j,:)) < tol
Am i right?

请先登录,再进行评论。


Star Strider
Star Strider 2015-9-21
编辑:Star Strider 2015-9-21
Try this one line of code instead of the entire loop structure:
[neigh, neigh_no] = ismember(neigh, hex_center, 'rows');
Also, since ‘neigh_no’ returns one value that is 0, the documentation for ismember explains ‘The output array, Locb, contains 0 wherever A is not a member of B.’ (The Locb variable in the documentation is ‘neigh_no’ here.)
EDIT — Added link to ismember documentation.
  3 个评论
Image Analyst
Image Analyst 2015-9-22
Compute the distances. I think you can use pdist() if you have the stats toolbox. Then find distances less than about 1.75 times the separation to find the immediate neighbors.
Star Strider
Star Strider 2015-9-22
You can introduce a tolerance with the ismember function by using ismembertol (introduced in R2015a).
If you have an earlier version, consider using the newest version of round (with two arguments) to round to a specific number of decimal places. If you don’t have that version of round, you can simulate it with this function to reduce argument precision for ismember:
roundn = @(x,n) round(x*10.^n).*10.^(-n);
It rounds ‘x’ to ‘n’ places to the right of the decimal (n>0) or to the left of the decimal (n<0). For n=0 it’s the usual round function.
Either of these should solve the tolerance problem. (Your data produced the desired result with my original code, so I didn’t initially suggest ismembertol or rounding.)

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Labels and Annotations 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by