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函数。