FFTSHIFT的四種寫法
前言
matlab說,“你讀過書,……我便考你一考。fftshift的函數,怎樣寫的?”我想,討飯一樣的人,也配考我么?便回過臉去,不再理會。matlab等了許久,很懇切的說道,“不能寫罷?……我教給你,記着!這些代碼將來做程序員的時候,前端要用。”我暗想我和程序員的等級還很遠呢,而且前端從來用不到圖像處理;又好笑,又不耐煩,懶懶的答他道,“誰要你教,不就是直接調用fftshift么?”matlab顯出極高興的樣子,將兩個指頭的長指甲敲着櫃台,點頭說,“對呀對呀!……fftshift的代碼有四樣寫法,你知道么?”我愈不耐煩了,努着嘴走遠。matlab剛用指甲蘸了酒,想在櫃上寫代碼,見我毫不熱心,便又嘆一口氣,顯出極惋惜的樣子。
四種寫法
- 使用
type fftshift.m
直接看fftshift函數:
- 什么!!原來是個空架子,直接調用了circshift,不過我還是找來了早年fftshift的源碼:
[x, y] = size (V);
xx = ceil (x/2);
yy = ceil (y/2);
retval = V([xx+1:x, 1:xx], [yy+1:y, 1:yy]);
+ 讓我們來運行對比一下:
+ ??結果竟然不一樣,肯定是Matlab暗改了!
- 讓我們來自己寫一哈fftshift的代碼:
nd = ndims (x);
sz = size (x);
sz2 = ceil (sz ./ 2);
idx = repmat ({':'},1,2);
for i = 1:nd
idx{i} = [sz2(i)+1:sz(i), 1:sz2(i)];
end
retval = x(idx{:});
+ 相信自己,一定能成功!
+ 惡膜某蛤秒沒命,一定是我太弱了,代碼寫錯了!
- 讓我們來使用調用的circshift試試看!
- 找的代碼:
nd=2;
sz=size(I);
n=floor(size(I)/2);
idx = repmat ({':'},1,nd);
for i = 1:nd;
b=n(i);
d=sz(i);
if(b>0)
b=rem(b,d);
idx{i}=[d-b+1:d,1:d-b];
elseif(b<0)
b=rem(abs(b),d);
idx{i}=[b+1:d,1:b];
end
end
+ 運行結果:
+ 是在哈輸了!
- 不聽不聽,我們再寫一個代碼:
- Code:
sz = ceil(size(A)/2);
A = A([sz(1)+1:end, 1:sz(1)], [sz(2)+1:end, 1:sz(2)]);
+ 打擾了:
- 驗證4個函數的正確性
- 我們定義一個3X3填充1-9的矩陣,他fftshift的正確結果是:
- 函數1結果:
- 函數2結果:
- 函數3結果:
- 函數4結果:
- 我們定義一個3X3填充1-9的矩陣,他fftshift的正確結果是:
- 竟然都是對的!究竟是道德的淪喪還是人性的扭曲,歡迎收看《十大未解之謎》之matlab的fftshift函數。