Filtering the common rows between two matrices
조회 수: 7 (최근 30일)
이전 댓글 표시
I have two matrices A and B. Matrix A consists of 3 columns and matrix B consists of 4 columns.
A = [1 2 3; 4 5 6; 7 8 9];
B = [1 2 3 90; 3 1 2 88; 4 5 6 17; 6 5 4 19; 7 8 9 12; 15 18 22 20];
And I want to filter the common rows between matrix A and B according to each row of A and store the common rows of matrix B in a cell. This cell consists of multiple arrays equal to the number of the rows of matrix A.
The expected result should be something like that:
matching_cell{1} = [1 2 3 90; 3 1 2 88];
matching_cell{2} = [4 5 6 17; 6 5 4 19];
matching_cell{3} = [7 8 9 12];
Note: I do not want to use neasted for loop with ismember as the matrices dimensions are large and it will take a lot of time to run.
Thanks.
댓글 수: 3
Stephen23
2024년 2월 1일
이동: Dyuman Joshi
2024년 2월 25일
Note that SPLITAPPLY will fail if any row of A does not exist in B (or produce a shorter output array):
A = [1 2 3; 0 0 0; 4 5 6];
B = [1 2 3 90; 3 1 2 88; 4 5 6 17; 6 5 4 19; 7 8 9 12; 15 18 22 20];
C = sort(B,2);
[idx1,idx2]=ismember(C(:,1:size(A,2)), A, 'rows');
out = splitapply(@(x) {x}, B(idx1,:), idx2(idx1))
Dyuman Joshi
2024년 2월 25일
이동: Dyuman Joshi
2024년 2월 25일
Yes, Thank you for pointing it out, I am aware of the requirement of spliapply() as stated in the error message.
As of now, I can't seem think of a solution that would work for all cases, so I am moving my answer to a comment, and accepting your answer as it provides a robust solution.
채택된 답변
Stephen23
2024년 2월 1일
편집: Stephen23
2024년 2월 1일
A = [1,2,3; 4,5,6; 7,8,9]
B = [1,2,3,90; 3,1,2,88; 4,5,6,17; 6,5,4,19; 7,8,9,12; 15,18,22,20]
[X,Y] = ismember(sort(B(:,1:3),2),A,'rows');
F = @(n)B(n==Y,:);
C = arrayfun(F,1:size(A,1),'uni',0)
C{:}
This will produce a consistent 1*size(A,1) output cell array, even if there are rows that do not match.
댓글 수: 0
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Logical에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!