Return subscripts of common rows for multi-dimensional matrix?

I have a 8x2 matrix, A, and a 133x2x5 matrix, B. I want to return the the layer in B in which a row in A matches a row in B. How can I do that? I tried using intersect and ismember but have not had any luck thus far. Having a hard time with the matrix being multi-dimensional.

댓글 수: 4

Is it the location, row, col and layer of any B element that is also in A?
Or the row and layer of the 1x2x1 rows of B that are also rows of A?
Sorry, I was confusing in my original post. I want the layer in B in which any complete row in A matches any complete row in B.
And you don't care about which is the row in B that match a A row in that layer?
I do not care about that. It can be any row in B in any layer, as long as it matches to a row in A.

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

 채택된 답변

Guillaume
Guillaume 2018년 7월 13일
편집: Guillaume 2018년 7월 13일
[row, layer] = ind2sub([size(B, 1), size(B, 3)], find(ismember(reshape(permute(B, [1 3 2]), [], size(B, 2)), A, 'rows')))
If you want just the layers in which any row matches any row of A:
layer = unique(layer)
edit: By the way the logic of this is to reshape B into a two column matrix by vertically concatenating the layers. Then use the traditional ismember(..., 'rows') and finally convert the matched rows back into (row, layer) coordinate.
Another way, avoiding the sub2ind would be:
layer = unique(ceil(find(ismember(reshape(permute(B, [1 3 2]), [], size(B, 2)), A, 'rows')) / size(B, 1)))

추가 답변 (1개)

dpb
dpb 2018년 7월 13일
ix=mod(find(all(ismember(A,B),2)),size(A,3));

댓글 수: 4

I'm not sure I understand the logic of this, but isn't this guaranteed to return some 0 ix because of the mod?
dpb
dpb 2018년 7월 13일
편집: dpb 2018년 7월 13일
Yes, that indicates last row of given plane...the logic is simply to find the rows in the 2D vector that match (fake the 'rows' option for 3D array A) and then the modulo returns the plane given the size of the third dimension.
Thank you for the answer but I went with dpb's answer because yours was returning 0s.
It is dpb's and it's supposed to be zero...the "fixup" is
ix(ix==0)=size(A,3);
I posted it as much as a lark as anything... :) G's is a much more legible and therefore maintainable approach.

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

카테고리

도움말 센터File Exchange에서 Resizing and Reshaping Matrices에 대해 자세히 알아보기

질문:

2018년 7월 13일

댓글:

dpb
2018년 7월 13일

Community Treasure Hunt

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

Start Hunting!

Translated by