基本上,我正在寻找flipud
和fliplr
的概括来翻转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
是多么昂贵,但如果是的话,我也会对更有效的非内置方法感兴趣。
答案 0 :(得分:7)
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{:});