2014-02-22 19 views
3

基本上,我在尋找flipudfliplr的泛化來翻轉nd數組的第i維。是否有一種內置的方法來翻轉nd數組的第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-ing都是多麼昂貴,但如果是這樣,我也會對更高效的非內置方法感興趣。

回答

7

數組如果你有R2013b +你應該使用newflip功能:

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

對於老版本,你可以使用flipdim

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

在您的命令窗口輸入edit flipdim可以看到flipdim的智能代碼。

+1

良好的聯繫。我想知道'flip'是如何提供更快,更高效的內存選擇的「,以及它所帶來的改進有多重要。無論如何,我一定會從「flipdim」翻轉到「flip」。 – chappjc

+0

@chappjc:'flip'是一個本地函數,而'flipdim'不是。對於我的機器上的大型陣列,一些簡單的時間測試「flip」大約快了2.5倍。至少在大數組的情況下,'flipdim'需要建立一個大的索引向量,但是可能還有其他的C級優化。 – horchler

相關問題