是否有内置方式来翻转nd-array的第i维?

kjo*_*kjo 3 matlab multidimensional-array

基本上,我正在寻找一个概括flipudfliplr翻转nd-array的第i维.

当要翻转的尺寸是第一个时,我想我可以使用

function flipped = flipfirst(ndarr)
    sz = size(ndarr);
    flipped = reshape(flipud(reshape(ndarr, sz(1), [])), sz);
end
Run Code Online (Sandbox Code Playgroud)

同样,如果要翻转的维度是最后一个,我可以使用

function flipped = fliplast(ndarr)
    sz = size(ndarr);
    flipped = reshape(fliplr(reshape(ndarr, [], sz(end))), sz);
end
Run Code Online (Sandbox Code Playgroud)

我确信我可以编写更通用的代码,通过调用permute和诸如此类的东西,但是有什么内置的吗?

我不确定reshape上面所有的内容是多么昂贵,但如果是的话,我也会对更有效的非内置方法感兴趣.

hor*_*ler 7

如果您有R2013b +,您应该使用 flip功能:

A = rand(2,2,2);
B = flip(A,3);
Run Code Online (Sandbox Code Playgroud)

对于旧版本,您可以使用flipdim:

A = rand(2,2,2);
B = flipdim(A,3);
Run Code Online (Sandbox Code Playgroud)

键入edit flipdim在命令窗口中看到的聪明的代码flipdim.


Cri*_*ngo 5

您还可以使用离散傅立叶变换时间反转属性翻转数组。下面的代码适用于任意数量的维度,但我们使用二维数组来演示它,因为它更容易检查结果。

A = magic(8);

d = 1; % dimension along which to flip

% Create frequency array w, we need it to go along dimension d
sz = size(A, d);
w = 2*pi * (0:sz-1) / sz;
w = shiftdim(w(:), 1-d);

% The actual time reversal property:
B = ifft( conj(fft(A, [], d)) .* exp(1j*w), [], d, 'symmetric');
Run Code Online (Sandbox Code Playgroud)

(是的,与 相比,这过于复杂且昂贵得离谱flip,但它很有趣!)