На форма-независимой нарезки ndarrays

В этом посте я использую терминломтик ссылаться на подмассивB_i изnмассивA такой, чтоsize(B_i, d) равен 1, для некоторого измеренияd. A состоит изsize(A, d) такие кусочки, соединенные вдоль измеренияd.

Например, еслиndims(A) 6 иd 3, то выражения вида

A(:, :, i, :, :, :)

заi в1:size(A, d) представлять все срезы (вдоль измеренияd) которые составляютA.

Проблема с выражением типаA(:, :, i, :, :, :) в том, что это не может быть обобщеносимволически на кусочки по размеру, отличному от 3, в массивах, имеющих количество измерений, отличное от 6. Например, чтобы получитьAСрезы вдоль измерения 2, нужно другое выражение,A(:, i, :, :, :, :), Это означает, что такие выражения бесполезны в коде, который не зависит от формы некоторого массива, из которого должны быть извлечены фрагменты.

Приведенная ниже функция является моей попыткой matlab-noob реализовать независимое от формы срезание. (Имяslice уже занято, значит я назвал функциюhslice, Короче дляhyperslice.) Стратегия функции состоит в том, чтобы преобразовать входной массив в подходящий трехмерный массив, взять нужный срез вдоль измененного массива.второй размер, и изменить форму результата, чтобы иметь форму среза из исходного входного массива.

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

Есть ли встроенный или, по крайней мере, более эффективный способ достижения того же результата (без учета формы)?

Ответы на вопрос(2)

Ваш ответ на вопрос