Matriz 3d: como usar pares (linha, coluna) com curinga de terceira dimensão no MATLAB?
Eu tenho uma matriz tridimensional e uma lista de pares (linha, coluna). Eu gostaria de extrair a matriz bidimensional que corresponde aos elementos nessas posições, projetados através da profundidade da matriz. Por exemplo, suponha,
>> a = rand(4, 3, 2)
a(:,:,1) =
0.5234 0.7057 0.0282
0.6173 0.2980 0.9041
0.7337 0.9380 0.9639
0.0591 0.8765 0.1693
a(:,:,2) =
0.8803 0.2094 0.5841
0.7151 0.9174 0.6203
0.7914 0.7674 0.6194
0.2009 0.2542 0.3600
>> rows = [1 4 2 1];
>> cols = [1 2 1 3];
O que eu gostaria de receber é,
0.5234 0.8765 0.6173 0.0282
0.8803 0.2542 0.7151 0.5841
talvez com alguma permutação de dimensões. Além disso, embora este exemplo tenha o curinga na última dimensão, também tenho casos em que ele está na primeira ou na segunda.
Eu tentei ingenuamentea(rows, cols, :)
e tenho uma matriz 3d onde o plano diagonal é o que eu quero. Eu também encontreisub2ind
, que extrairá os elementos desejados doa(:,:,1)
avião. Eu poderia trabalhar com um deles para obter o que eu quero, mas estou me perguntando se existe algum método mais canônico, elegante ou eficiente que eu esteja perdendo?
Esta foi a solução que usei, com base na resposta postada abaixo,
sz = size(a);
subs = [repmat(rows, [1, sz(3)]);
repmat(cols, [1, sz(3)]);
repelem([1:sz(3)], length(rows))];
result = a(sub2ind(sz, subs(1,:), subs(2,:), subs(3,:)));