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