Compare Matrices within tolerance range

19 ビュー (過去 30 日間)
Anna Lin
Anna Lin 2015 年 6 月 12 日
編集済み: Paul Hoffrichter 2020 年 12 月 10 日
Hi. I have a matrix A that is 8323 by 3 and matrix B that is 3 by 3. Elements in both these matrices have decimals. I want to find rows in A that is within 5% tolerance of rows in B. I am pretty sure you have to use for loop and if statements to find it. However, i am not sure what to write. I made 2 matrices C and D of same size as B since i calculated the max and min values that correspond to B values.
for y=1:3
for x=1:n1
if Points1(:,y)<=none1(x,y) && Points1(:,y)>=none3(x,y)
%not sure what to write
And as always, thanks.
  5 件のコメント
Image Analyst
Image Analyst 2015 年 6 月 13 日
I guess she meant "the thousands place", which would be the third place after the decimal. I wish it were thousands of decimal places - maybe in another 50 years it will be.
Jan
Jan 2015 年 6 月 13 日
編集済み: Jan 2015 年 6 月 13 日
@Anna Lin: points3, Points1, A, B, C, D, none1, none3 - the bunch of variables is at least confusing. What is the wanted result? Do you want a [8323 x 1] logical vector with a true, if the corresponding row of A is inside one of the three intervals defined by the rows 0.09*B and 1.05*B? Or do you want a [8823 x 3] array?

サインインしてコメントする。

回答 (2 件)

Guillaume
Guillaume 2015 年 6 月 13 日
Starting in R0215a, there is the function ismembertol that does more or less what you want:
iswithintol = ismembertol(A, B, 0.05, 'ByRows', true)
will find rows of A that differ from the rows of B by no more than 5% of the max of A and B. There are options to change the tolerance criteria.
  1 件のコメント
Paul Hoffrichter
Paul Hoffrichter 2020 年 12 月 10 日
I was looking up a solution for this problem when I saw ismembertol above. But consider:
A = [1 2 3];
B = [3 1 2];
In my case, and possibly in the OP, A and B are out of tolerance since I want each element of A to be within tolerance of the corresponding element of B. But we get:
ismembertol(A,B)
ans =
1×3 logical array
1 1 1

サインインしてコメントする。


Paul Hoffrichter
Paul Hoffrichter 2020 年 12 月 10 日
編集済み: Paul Hoffrichter 2020 年 12 月 10 日
For a tolerance match between corresponding elements of the rows, start off with this:
a = a(:);
b = b(:);
%% Check for equivalence of each element, within the tolerance
yn = abs(a - b) <= eps(max(abs(a), abs(b)));
yn = all(yn); % scalar logical output
Next step is to modify above to include desired tolerance.

カテゴリ

Help Center および File ExchangeMatrices and Arrays についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by