В этом сообщении я использую термин slice для обозначения подмассива 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
.) Стратегия функции состоит в том, чтобы преобразовать входной массив в подходящий 3-мерный массив, взять желаемый фрагмент вдоль измененного массива второго размера и изменить форму результата, чтобы иметь форму среза из исходного входного массива.
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
Есть ли встроенный или, по крайней мере, более эффективный способ достижения одного и того же результата (в форме-агностическом)?