• [0413] FFTSHIFT的四种写法


    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结果:
    • 竟然都是对的!究竟是道德的沦丧还是人性的扭曲,欢迎收看《十大未解之谜》之matlab的fftshift函数。
  • 相关阅读:
    百度首页暗藏的2019招聘广告彩蛋,非技术人员很难发现,看来是定向发送啊
    ipv6地址在URL中的表达方式,如何在URL地址中包含ipv6地址
    只用ipv6 两台机器共享文件夹, 局域网连接路径,共享文件夹路径中ipv6地址如何表示
    iconfont图标symbol引用方式,有的图标不能通过设置color样式来修改颜色的解决办法
    shell脚本面试题
    常用的Shell脚本
    JAVA面试题
    Linux系统基础优化
    Linux磁盘设备基础
    Linux系统的目录结构及常见目录总结
  • 原文地址:https://www.cnblogs.com/shy-/p/8825136.html
Copyright © 2020-2023  润新知