На форма-независимой нарезки 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
Есть ли встроенный или, по крайней мере, более эффективный способ достижения того же результата (без учета формы)?