필터 지우기
필터 지우기

compare two matrices with isequal

조회 수: 6 (최근 30일)
Alberto Acri
Alberto Acri 2023년 7월 25일
댓글: Steven Lord 2023년 7월 25일
Hi. I need to compare matrices present inside two separate cells (cells 'AAA' and 'BBB').
AAA = importdata("AAA.mat");
BBB = importdata("BBB.mat");
To be precise AAA{1,1} must equal BBB{1,1}, AAA{2,1} must equal BBB{2,1} and so on...
Is it correct to use the isequal command in this way?
AAA = importdata("AAA.mat");
BBB = importdata("BBB.mat");
equal = isequal(AAA,BBB);
Or should I compare the matrices inside a loop as in this case?
AAA = importdata("AAA.mat");
BBB = importdata("BBB.mat");
% FIRST COLUMN
check_1 = {};
check_2 = {};
for K_1_col = 1:height(AAA)
AAA_1_col = AAA{K_1_col,1};
BBB_1_col = BBB{K_1_col,1};
equal_1_col = isequal(AAA_1_col,BBB_1_col);
result = AAA_1_col==BBB_1_col;
check_1 = [check_1;{equal_1_col}];
check_2 = [check_2;{result}];
end
Or are all three ways equivalent ?

채택된 답변

Bruno Luong
Bruno Luong 2023년 7월 25일
편집: Bruno Luong 2023년 7월 25일
A single call of isequal on the top level is OK.
Note that is you have NaN somewhere in your data, isequal will fail to detect indentical arrays.
a=rand(2);
c=repmat({a},3,4);
d=c;
isequal(c,d) % true
ans = logical
1
a(1)=nan;
c=repmat({a},3,4);
d=c;
isequal(c,d) % false
ans = logical
0
  댓글 수: 5
Bruno Luong
Bruno Luong 2023년 7월 25일
편집: Bruno Luong 2023년 7월 25일
OK, thank you. But using isequal command directly are all matrices analyzed ?
Yes. That's what I said everytime you ask the same question.
If two matrices placed in the same position are not equal how can I identify that matrix?
You can't. ISEQUAL only gives yes/no answer.
Steven Lord
Steven Lord 2023년 7월 25일
If two matrices placed in the same position are not equal how can I identify that matrix?
You can't. ISEQUAL only gives yes/no answer.
You can't with isequal. The isequal function returns whether or not the whole array is the same. For checking individual elements you'll need to use == but that's not defined for cell arrays (since a cell array can contain anything.)
For this purpose you could use a for loop over the elements of AA and BB (though if you have nested cell arrays, you'd need to dig down into the data nested inside) or you could use cellfun to do it in one function call. The comparisonFunction compares all the elements in its two inputs to determine whether they are equal then makes sure all the elements of the resulting array (operating in 'all' the dimensions of that result) are true. If it is, comparisonFunction returns true, otherwise it returns false.
AA = {1, [2, 3]; [4; 5], [6 7; 8 9]};
BB = {0, [2, 3]; [4; 5], [6 7; 9 8]};
comparisonFunction = @(x, y) all(x == y, 'all');
result = cellfun(comparisonFunction, AA, BB)
result = 2×2 logical array
0 1 1 0
In this case, to handle the scenario where comparisonFunction throws an error (if the contents of the cells are different sizes, for example) I'd specify an 'ErrorHandler' that just returns false (if the inputs aren't the same size, they can't be equal.)
CC = BB;
CC{2, 2} = magic(3);
result = cellfun(comparisonFunction, AA, CC, 'ErrorHandler', @(varargin) false)
result = 2×2 logical array
0 1 1 0
What if I hadn't specified the ErrorHandler? Well, == can't compare a 2-by-2 (the 4th element in AA) with a 3-by-3 (the 4th element in CC) because ...
result = cellfun(comparisonFunction, AA, CC)
Arrays have incompatible sizes for this operation.

Error in solution>@(x,y)all(x==y,'all') (line 3)
comparisonFunction = @(x, y) all(x == y, 'all');

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Programming에 대해 자세히 알아보기

제품


릴리스

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by