Em fatias agnósticas de ndarrays
Neste post, estou usando o termofatia para se referir a uma sub-matrizB_i
de umntridimensionalA
de tal modo quesize(B_i, d)
é 1, para alguma dimensãod
. A
consiste emsize(A, d)
fatias concatenadas ao longo da dimensãod
.
Por exemplo, sendims(A)
é 6 ed
é 3, então as expressões do formulário
A(:, :, i, :, :, :)
parai
no1:size(A, d)
representam todas as fatias (ao longo da dimensãod
) que compõemA
.
O problema com uma expressão comoA(:, :, i, :, :, :)
é que não pode ser generalizadosimbolicamente para fatias ao longo de uma dimensão diferente de 3 em matrizes com um número de dimensões diferente de 6. Por exemplo, para obterA
nas fatias da dimensão 2, seria necessário uma expressão diferente,A(:, i, :, :, :, :)
. Isso significa que essas expressões são inúteis em códigos independentes da forma de alguma matriz da qual as fatias devem ser extraídas.
A função abaixo é minha tentativa do matlab-noob de implementar o fatiamento agnóstico de forma. (O nomeslice
já está em uso, por isso chamei a funçãohslice
, abreviatura dehyperslice
.) A estratégia da função é remodelar a matriz de entrada em uma matriz 3-d adequada, levar a fatia desejada ao longo da matriz remodeladasegundo dimensão e remodelar o resultado para ter a forma de uma fatia da matriz de entrada original.
function out = hslice(ndarray, d, i)
sz = size(ndarray);
pfx = sz(1:d-1); % dimensions before d
sfx = sz(d+1:end); % dimensions after d
tmp = reshape(ndarray, prod(pfx), sz(d), prod(sfx));
out = reshape(tmp(:, i, :), [pfx 1 sfx]);
end
Existe uma maneira integrada, ou pelo menos mais eficiente, de obter o mesmo resultado (de maneira independente da forma)?