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 obterAnas 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)?

questionAnswers(2)

yourAnswerToTheQuestion