【请教】FFTShift或者说矩阵的行或列的交换问题
mathematica吧
全部回复
仅看楼主
level 4
任道正 楼主
我自己写了一个函数,用于交换矩阵的行或者列,该函数首先将矩阵分为上下两部分并交换位置(交换行);随后又将矩阵分为左右两部分并交换位置(交换列);然后返回交换后的矩阵即可!
代码如下:
FFTShift[mtx_] := Block[{dim = Dimensions@mtx},
midx = Round[dim[[1]]/2];
midy = Round[dim[[2]]/2];
mtxtmp = ConstantArray[0, dim];
mtxtmp[[All, 1 ;; midy]] = mtx[[All, -midy ;; -1]];
mtxtmp[[All, midy + 1 ;;]] =
mtx[[All, 1 ;; dim[[2]] - midy]];(*交换行*)
mtxout = ConstantArray[0, dim];
mtxout[[1 ;; midx, All]] = mtxtmp[[-midx ;; -1, All]];
mtxout[[midx + 1 ;;, All]] =
mtxtmp[[1 ;; dim[[1]] - midx, All]];(*交换列*)
mtxout];
然而可以看到以上函数其实就得定义mtxtmp和mtxout俩中间变量,这将占用大量额外内存,有没有什么办法达到同样的效果而不占用更多内存的?或者Mathematica有没有类似MataLab中FFTShift的内置函数?
2018年10月29日 02点10分 1
level 4
任道正 楼主
问题已解决,一行代码就OK !
FFTShift[mtx_] := RotateRight[mtx, IntegerPart[(Dimensions@mtx)/2]];
吐槽一下,这个RotateRight明明是把矩阵元素往右平移,为啥叫Rotate不叫ShiftRight~
2018年10月29日 03点10分 2
吧务
level 15
相关的帖子其实很多。比如:https://mathematica.stackexchange.com/a/154060/1871
2018年11月03日 08点11分 4
谢谢啦!我在贴吧搜了好久,搜到之前别人你和别人讨论的帖子,里面提到RotateRight这个函数,能很方便的实现FFTSHift~
2018年11月03日 09点11分
1