Return subscripts of common rows for multi-dimensional matrix?
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Andrew Poissant
el 13 de Jul. de 2018
Comentada: dpb
el 13 de Jul. de 2018
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 comentarios
Guillaume
el 13 de Jul. de 2018
And you don't care about which is the row in B that match a A row in that layer?
Respuesta aceptada
Guillaume
el 13 de Jul. de 2018
Editada: Guillaume
el 13 de Jul. de 2018
[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)))
Más respuestas (1)
dpb
el 13 de Jul. de 2018
ix=mod(find(all(ismember(A,B),2)),size(A,3));
4 comentarios
dpb
el 13 de Jul. de 2018
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.
Ver también
Categorías
Más información sobre Matrices and Arrays en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!