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

时间:2014-02-22 23:07:49

标签: matlab multidimensional-array

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

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

function flipped = flipfirst(ndarr)
    sz = size(ndarr);
    flipped = reshape(flipud(reshape(ndarr, sz(1), [])), sz);
end

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

function flipped = fliplast(ndarr)
    sz = size(ndarr);
    flipped = reshape(fliplr(reshape(ndarr, [], sz(end))), sz);
end

我确信我可以通过调用permute以及诸如此类的内容来编写更通用的代码,但是内置了什么内容吗?

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

4 个答案:

答案 0 :(得分:7)

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

A = rand(2,2,2);
B = flip(A,3);

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

A = rand(2,2,2);
B = flipdim(A,3);

在命令窗口中输入edit flipdim,以查看flipdim的聪明代码。

答案 1 :(得分:5)

您还可以使用time reversal property of the Discrete Fourier Transform翻转数组。下面的代码可用于任意数量的尺寸,但是我们使用2D数组进行演示,因为它更易于检查结果。

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');

(是的,与flip相比,它过于复杂且荒唐,但很有趣!)

答案 2 :(得分:4)

来自flipdim

  

沿指定维度翻转数组

答案 3 :(得分:1)

也很有趣...

这使用了从单元格数组生成的comma-separated list以及一个不太为人所知的事实you can use ':' as an index

A = rand(3,4,5);                  % input array
dim = 2;                          % dimension to flip along
c = repmat({':'}, 1, ndims(A));
c{dim} = size(A, dim):-1:1;
B = A(c{:});