在这篇文章中,我使用切片一词来指代B_i某个维度的n维数组的子数组,A例如size(B_i, d)1 d。 A由此size(A, d)类切片组成,这些切片沿着维度串联在一起d。
例如,如果ndims(A)为6且d为3,则该形式的表达式
A(:, :, i, :, :, :)
for iin 1:size(A, d)表示组成的所有切片(沿维度d)A。
像这样的表达式存在的问题A(:, :, i, :, :, :)是,它不能被符号化地概括为具有多个不同于6的维数的数组中沿3的维数A的切片。例如,要获得沿2的维的切片,则需要一个不同的表达式,A(:, i, :, :, :, :)。这意味着这样的表达式在对要从中提取切片的某些数组的形状不可知的代码中毫无用处。
下面的功能是我的matlab-noob尝试实现形状不可知的切片。(名称slice已经被使用,因此我将其称为函数hslice,简称hyperslice。)函数的策略是将输入数组重塑为合适的3-d数组,沿着重塑后的数组的第二维获取所需的切片,并将结果重塑为具有原始输入数组的切片形状。
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
是否有内置的或至少更有效的方式来实现相同的结果(与形状无关的方式)?
ibeautiful
阿晨1998
手掌心