精华内容
下载资源
问答
  • 对于js的原型原型链的理解

    万次阅读 多人点赞 2019-06-23 22:20:23
    原型是定义了一些公用的属性方法,利用原型创建出来的新对象实例会共享原型的所有属性方法 实例代码: // 创建原型 var Person = function ( name ) { this . name = name ; } ; //...

    一、原型与原型链

    1. JavaScript是一门基于原型的语言,在软件设计模式中,有一种模式叫做原型模式,JavaScript正是利用这种模式而被创建出来
    2. 原型模式是用于创建重复的对象,同时又能保证性能,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。原型模式的目的是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,也就是说利用已有的一个原型对象,可以快速地生成和原型对象一样的新对象实例
    3. 原型:一个可以被复制(或者叫克隆)的一个类,通过复制原型可以创建一个一模一样的新对象,也可以说原型就是一个模板,在设计语言中更准确的说是一个对象模板
      1)原型是定义了一些公用的属性和方法,利用原型创建出来的新对象实例会共享原型的所有属性和方法
      实例代码:
        // 创建原型
        var Person = function(name){
            this.name = name;
        };
    
        // 原型的方法
       Person.prototype.sayHello = function(){
           console.log(this.name+",hello");
       };
    
       // 实例化创建新的原型对象,新的原型对象会共享原型的属性和方法
       var person1 = new Person("zhangsan");
       var person2 = new Person("lisi");
    
       // zhangsan,hello
       person1.sayHello();
       // lisi,hello
       person2.sayHello();
    

    2)严格模式下,原型的属性和方法还是会被原型实例所共享的
    实例代码:

        // 开启严格模式,原型的属性和方法还是会被原型实例所共享的
       "use strict";
    
        // 创建原型
        var Person = function(name){
            this.name = name;
        };
    
        // 原型的方法
       Person.prototype.sayHello = function(){
           console.log(this.name+",hello");
       };
    
       // 实例化创建新的原型对象,新的原型对象会共享原型的属性和方法
       var person1 = new Person("zhangsan");
       var person2 = new Person("lisi");
    
       // zhangsan,hello
       person1.sayHello();
       // lisi,hello
       person2.sayHello();
    

    3)通过原型创建的新对象实例是相互独立的,为新对象实例添加的方法只有该实例拥有这个方法,其它实例是没有这个方法的
    实例代码:

        // 创建原型
        var Person = function(name){
            this.name = name;
        };
    
        // 原型的方法
       Person.prototype.sayHello = function(){
           console.log(this.name+",hello");
       };
    
       // 实例化创建新的原型对象,新的原型对象会共享原型的属性和方法
       var person1 = new Person("zhangsan");
       var person2 = new Person("lisi");
    
       // zhangsan,hello
       person1.sayHello();
       // lisi,hello
       person2.sayHello();
    
       
       // 为新对象实例添加方法
       // 通过原型创建的新对象实例是相互独立的
       person1.getName = function(){
           console.log(this.name);
       }
    
       // zhangsan
       person1.getName();
       // Uncaught TypeError: person2.getName is not a function
       person2.getName();
    

    4)原型的总结

    • 所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象
    • 所有函数都有一个prototype(原型)属性,属性值是一个普通的对象
    • 所有引用类型的__proto__属性指向它构造函数的prototype

    5)函数的原型prototype:函数才有prototype,prototype是一个对象,指向了当前构造函数的引用地址
    6)函数的原型对象__proto__:所有对象都有__proto__属性, 当用构造函数实例化(new)一个对象时,会将新对象的__proto__属性指向 构造函数的prototype
    7)原型对象和函数的原型的关系
    在这里插入图片描述
    说明

    • 所有函数的__proto__都是指向Function的prototype
    • 构造函数new出来的对象__proto__指向构造函数的prototype
    • 非构造函数实例化出的对象或者对象的prototype的__proto__指向Object的prototype
      Object的prototype指向null

    8)所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)
    9)实例的构造函数属性(constructor)指向构造函数 :person1.constructor == Person
    10)原型对象(Person.prototype)是 构造函数(Person)的一个实例
    11)原型的分类:
    隐式原型(_proto_):上面说的这个原型是JavaScript中的内置属性[[prototype]],此属性继承自object对象,在脚本中没有标准的方式访问[[prototype]],但Firefox、Safari和Chrome在每个对象上都支持一个属性_proto_,隐式原型的作用是用来构成原型链,实现基于原型的继承
    显示原型(prototype):每一个函数在创建之后,便会拥有一个prototype属性,这个属性指向函数的原型对象,显示原型的作用是用来实现基于原型的继承与属性的共享
    12)原型的使用方式
    通过给Calculator对象的prototype属性赋值对象字面量来设定Calculator对象的原型
    在赋值原型prototype的时候使用function立即执行的表达式来赋值,可以封装私有的function,通过return的形式暴露出简单的使用名称,以达到public/private的效果

    1. 原型链
      1)原型链:原型链是原型对象创建过程的历史记录,当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构
      2)原型设计的问题:当查找一个对象的属性时,JavaScript 会根据原型链向上遍历对象的原型,直到找到给定名称的属性为止,直到到达原型链的顶部仍然没有找到指定的属性,就会返回 undefined
      也可以理解为原型链继承时查找属性的过程是先查找自身属性,当自身属性不存在时,会在原型链中逐级查找
      3)hasOwnProperty 函数:可以用来检查对象自身是否含有某个属性,返回值是布尔值,当属性不存在时不会向上查找对象原型链,hasOwnProperty是 JavaScript 中唯一一个处理属性但是不查找原型链的函数
      4)getOwnPropertyNames 函数:可以获取对象所有的自身属性,返回值是由对象自身属性名称组成的数组,同样不会向上查找对象原型链
      5)原型链的小结
    • 一直往上层查找,直到到null还没有找到,则返回undefined
    • Object.prototype.__proto__ === null
    • 所有从原型或更高级原型中的得到、执行的方法,其中的this在执行时,指向当前这个触发事件执行的对象

    6)JavaScript的原型是为了实现对象间的联系,解决构造函数无法数据共享而引入的一个属性,而原型链是一个实现对象间联系即继承的主要方法

    二、原型与原型链的常见面试题

    1. 谈谈你对原型的理解
      在 JavaScript 中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype 属性,这个属性指向函数的原型对象,使用原型对象的好处是所有对象实例共享它所包含的属性和方法

    2. 什么是原型链?原型链解决的是什么问题
      1)原型链解决的主要是继承问题
      2)每个对象拥有一个原型对象,通过 proto 指针指向其原型对象,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向 null(Object.proptotype.__proto__指向的是null)。这种关系被称为原型链(prototype chain),通过原型链一个对象可以拥有定义在其他对象中的属性和方法
      3)构造函数 Parent、Parent.prototype 和 实例 p 的关系如下:(p.__proto__ === Parent.prototype)
      在这里插入图片描述

    3. prototype 和 proto 区别是什么
      1)prototype是构造函数的属性
      2)__proto__是每个实例都有的属性,可以访问 [[prototype]] 属性
      3)实例的__proto__与其构造函数的prototype指向的是同一个对象

    展开全文
  • 傅里叶变换的意义和理解(通俗易懂)

    万次阅读 多人点赞 2017-06-05 15:14:31
    傅里叶变换的意义和理解(通俗易懂) 这篇文章的核心思想就是:要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸...

    傅里叶变换的意义和理解(通俗易懂)

    这篇文章的核心思想就是:要让读者在不看任何数学公式的情况下理解傅里叶分析。

    傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是,傅里叶分析的公式看起来太复杂了,所以很多大一新生上来就懵圈并从此对它深恶痛绝。老实说,这么有意思的东西居然成了大学里的杀手课程,不得不归咎于编教材的人实在是太严肃了。(您把教材写得好玩一点会死吗?会死吗?)所以我一直想写一个有意思的文章来解释傅里叶分析,有可能的话高中生都能看懂的那种。所以,不管读到这里的您从事何种工作,我保证您都能看懂,并且一定将体会到通过傅里叶分析看到世界另一个样子时的快感。至于对于已经有一定基础的朋友,也希望不要看到会的地方就急忙往后翻,仔细读一定会有新的发现。
    下面进入正题:
    抱歉,还是要啰嗦一句:其实学习本来就不是易事,我写这篇文章的初衷也是希望大家学习起来更加轻松,充满乐趣。但是千万!千万不要把这篇文章收藏起来,或是存下地址,心里想着:以后有时间再看。这样的例子太多了,也许几年后你都没有再打开这个页面。无论如何,耐下心,读下去。这篇文章要比读课本要轻松、开心得多……
    p.s.本文无论是cos还是sin,都统一用“正弦波”(Sine Wave)一词来代表简谐波。

    一、什么是频域

    从我们出生,我们看到的世界都以时间贯穿,股票的走势、人的身高、汽车的轨迹都会随着时间发生改变。这种以时间作为参照来观察动态世界的方法我们称其为时域分析。而我们也想当然的认为,世间万物都在随着时间不停的改变,并且永远不会静止下来。但如果我告诉你,用另一种方法来观察世界的话,你会发现世界是永恒不变的,你会不会觉得我疯了?我没有疯,这个静止的世界就叫做频域。

    先举一个公式上并非很恰当,但意义上再贴切不过的例子:

    在你的理解中,一段音乐是什么呢?

    这是我们对音乐最普遍的理解,一个随着时间变化的震动。但我相信对于乐器小能手们来说,音乐更直观的理解是这样的:

    好的!下课,同学们再见。

    是的,其实这一段写到这里已经可以结束了。上图是音乐在时域的样子,而下图则是音乐在频域的样子。所以频域这一概念对大家都从不陌生,只是从来没意识到而已。

    现在我们可以回过头来重新看看一开始那句痴人说梦般的话:世界是永恒的。

    将以上两图简化:

    时域:

    频域:

    在时域,我们观察到钢琴的琴弦一会上一会下的摆动,就如同一支股票的走势;而在频域,只有那一个永恒的音符。

    所以

    你眼中看似落叶纷飞变化无常的世界,实际只是躺在上帝怀中一份早已谱好的乐章。

    抱歉,这不是一句鸡汤文,而是黑板上确凿的公式:傅里叶同学告诉我们,任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。在第一个例子里我们可以理解为,利用对不同琴键不同力度,不同时间点的敲击,可以组合出任何一首乐曲。

    而贯穿时域与频域的方法之一,就是传中说的傅里叶分析。傅里叶分析可分为傅里叶级数(Fourier Serie)和傅里叶变换(Fourier Transformation),我们从简单的开始谈起。

    二、傅里叶级数(Fourier Series)的频谱

    还是举个栗子并且有图有真相才好理解。

    如果我说我能用前面说的正弦曲线波叠加出一个带90度角的矩形波来,你会相信吗?你不会,就像当年的我一样。但是看看下图:

    第一幅图是一个郁闷的正弦波cos(x)

    第二幅图是2个卖萌的正弦波的叠加cos(x)+a.cos(3x)

    第三幅图是4个发春的正弦波的叠加

    第四幅图是10个便秘的正弦波的叠加

    随着正弦波数量逐渐的增长,他们最终会叠加成一个标准的矩形,大家从中体会到了什么道理?

    (只要努力,弯的都能掰直!)

    随着叠加的递增,所有正弦波中上升的部分逐渐让原本缓慢增加的曲线不断变陡,而所有正弦波中下降的部分又抵消了上升到最高处时继续上升的部分使其变为水平线。一个矩形就这么叠加而成了。但是要多少个正弦波叠加起来才能形成一个标准90度角的矩形波呢?不幸的告诉大家,答案是无穷多个。(上帝:我能让你们猜着我?)

    不仅仅是矩形,你能想到的任何波形都是可以如此方法用正弦波叠加起来的。这是没
    有接触过傅里叶分析的人在直觉上的第一个难点,但是一旦接受了这样的设定,游戏就开始有意思起来了。

    还是上图的正弦波累加成矩形波,我们换一个角度来看看:

    在这几幅图中,最前面黑色的线就是所有正弦波叠加而成的总和,也就是越来越接近矩形波的那个图形。而后面依不同颜色排列而成的正弦波就是组合为矩形波的各个分量。这些正弦波按照频率从低到高从前向后排列开来,而每一个波的振幅都是不同的。一定有细心的读者发现了,每两个正弦波之间都还有一条直线,那并不是分割线,而是振幅为0的正弦波!也就是说,为了组成特殊的曲线,有些正弦波成分是不需要的。

    这里,不同频率的正弦波我们成为频率分量。

    好了,关键的地方来了!!

    如果我们把第一个频率最低的频率分量看作“1”,我们就有了构建频域的最基本单元。

    对于我们最常见的有理数轴,数字“1”就是有理数轴的基本单元。

    时域的基本单元就是“1秒”,如果我们将一个角频率为\omega_{0}的正弦波cos(\omega_{0}t)看作基础,那么频域的基本单元就是\omega_{0}

    有了“1”,还要有“0”才能构成世界,那么频域的“0”是什么呢?cos(0t)就是一个周期无限长的正弦波,也就是一条直线!所以在频域,0频率也被称为直流分量,在傅里叶级数的叠加中,它仅仅影响全部波形相对于数轴整体向上或是向下而不改变波的形状。

    接下来,让我们回到初中,回忆一下已经死去的八戒,啊不,已经死去的老师是怎么定义正弦波的吧。

    正弦波就是一个圆周运动在一条直线上的投影。所以频域的基本单元也可以理解为一个始终在旋转的圆

    想看动图的同学请戳这里:File:Fourier series square wave circles animation.gif

    以及这里:File:Fourier series sawtooth wave circles animation.gif

    点出去的朋友不要被wiki拐跑了,wiki写的哪有这里的文章这么没节操是不是。

    介绍完了频域的基本组成单元,我们就可以看一看一个矩形波,在频域里的另一个模样了:

    这是什么奇怪的东西?

    这就是矩形波在频域的样子,是不是完全认不出来了?教科书一般就给到这里然后留给了读者无穷的遐想,以及无穷的吐槽,其实教科书只要补一张图就足够了:频域图像,也就是俗称的频谱,就是——

    再清楚一点:

    可以发现,在频谱中,偶数项的振幅都是0,也就对应了图中的彩色直线。振幅为0的正弦波。

    动图请戳:

    File:Fourier series and transform.gif

    老实说,在我学傅里叶变换时,维基的这个图还没有出现,那时我就想到了这种表达方法,而且,后面还会加入维基没有表示出来的另一个谱——相位谱。

    但是在讲相位谱之前,我们先回顾一下刚刚的这个例子究竟意味着什么。记得前面说过的那句“世界是静止的”吗?估计好多人对这句话都已经吐槽半天了。想象一下,世界上每一个看似混乱的表象,实际都是一条时间轴上不规则的曲线,但实际这些曲线都是由这些无穷无尽的正弦波组成。我们看似不规律的事情反而是规律的正弦波在时域上的投影,而正弦波又是一个旋转的圆在直线上的投影。那么你的脑海中会产生一个什么画面呢?

    我们眼中的世界就像皮影戏的大幕布,幕布的后面有无数的齿轮,大齿轮带动小齿轮,小齿轮再带动更小的。在最外面的小齿轮上有一个小人——那就是我们自己。我们只看到这个小人毫无规律的在幕布前表演,却无法预测他下一步会去哪。而幕布后面的齿轮却永远一直那样不停的旋转,永不停歇。这样说来有些宿命论的感觉。说实话,这种对人生的描绘是我一个朋友在我们都是高中生的时候感叹的,当时想想似懂非懂,直到有一天我学到了傅里叶级数……

    三、傅里叶级数(Fourier Series)的相位谱

    上一章的关键词是:从侧面看。这一章的关键词是:从下面看。

    在这一章最开始,我想先回答很多人的一个问题:傅里叶分析究竟是干什么用的?这段相对比较枯燥,已经知道了的同学可以直接跳到下一个分割线。

    先说一个最直接的用途。无论听广播还是看电视,我们一定对一个词不陌生——频道。频道频道,就是频率的通道,不同的频道就是将不同的频率作为一个通道来进行信息传输。下面大家尝试一件事:

    先在纸上画一个sin(x),不一定标准,意思差不多就行。不是很难吧。

    好,接下去画一个sin(3x)+sin(5x)的图形。

    别说标准不标准了,曲线什么时候上升什么时候下降你都不一定画的对吧?

    好,画不出来不要紧,我把sin(3x)+sin(5x)的曲线给你,但是前提是你不知道这个曲线的方程式,现在需要你把sin(5x)给我从图里拿出去,看看剩下的是什么。这基本是不可能做到的。

    但是在频域呢?则简单的很,无非就是几条竖线而已。

    所以很多在时域看似不可能做到的数学操作,在频域相反很容易。这就是需要傅里叶变换的地方。尤其是从某条曲线中去除一些特定的频率成分,这在工程上称为滤波,是信号处理最重要的概念之一,只有在频域才能轻松的做到。

    再说一个更重要,但是稍微复杂一点的用途——求解微分方程。(这段有点难度,看不懂的可以直接跳过这段)微分方程的重要性不用我过多介绍了。各行各业都用的到。但是求解微分方程却是一件相当麻烦的事情。因为除了要计算加减乘除,还要计算微分积分。而傅里叶变换则可以让微分和积分在频域中变为乘法和除法,大学数学瞬间变小学算术有没有。

    傅里叶分析当然还有其他更重要的用途,我们随着讲随着提。

    ————————————————————————————————————

    下面我们继续说相位谱:

    通过时域到频域的变换,我们得到了一个从侧面看的频谱,但是这个频谱并没有包含时域中全部的信息。因为频谱只代表每一个对应的正弦波的振幅是多少,而没有提到相位。基础的正弦波A.sin(wt+θ)中,振幅,频率,相位缺一不可,不同相位决定了波的位置,所以对于频域分析,仅仅有频谱(振幅谱)是不够的,我们还需要一个相位谱。那么这个相位谱在哪呢?我们看下图,这次为了避免图片太混论,我们用7个波叠加的图。

    鉴于正弦波是周期的,我们需要设定一个用来标记正弦波位置的东西。在图中就是那些小红点。小红点是距离频率轴最近的波峰,而这个波峰所处的位置离频率轴有多远呢?为了看的更清楚,我们将红色的点投影到下平面,投影点我们用粉色点来表示。当然,这些粉色的点只标注了波峰距离频率轴的距离,并不是相位。


    这里需要纠正一个概念:时间差并不是相位差。如果将全部周期看作2Pi或者360度的话,相位差则是时间差在一个周期中所占的比例。我们将时间差除周期再乘2Pi,就得到了相位差。

    在完整的立体图中,我们将投影得到的时间差依次除以所在频率的周期,就得到了最下面的相位谱。所以,频谱是从侧面看,相位谱是从下面看。下次偷看女生裙底被发现的话,可以告诉她:“对不起,我只是想看看你的相位谱。”

    注意到,相位谱中的相位除了0,就是Pi。因为cos(t+Pi)=-cos(t),所以实际上相位为Pi的波只是上下翻转了而已。对于周期方波的傅里叶级数,这样的相位谱已经是很简单的了。另外值得注意的是,由于cos(t+2Pi)=cos(t),所以相位差是周期的,pi和3pi,5pi,7pi都是相同的相位。人为定义相位谱的值域为(-pi,pi],所以图中的相位差均为Pi。

    最后来一张大集合:

     

    四、傅里叶变换(Fourier Transformation)

    相信通过前面三章,大家对频域以及傅里叶级数都有了一个全新的认识。但是文章在一开始关于钢琴琴谱的例子我曾说过,这个栗子是一个公式错误,但是概念典型的例子。所谓的公式错误在哪里呢?

    傅里叶级数的本质是将一个周期的信号分解成无限多分开的(离散的)正弦波,但是宇宙似乎并不是周期的。曾经在学数字信号处理的时候写过一首打油诗:

    往昔连续非周期,

    回忆周期不连续,

    任你ZT、DFT,

    还原不回去。

    (请无视我渣一样的文学水平……)

    在这个世界上,有的事情一期一会,永不再来,并且时间始终不曾停息地将那些刻骨铭心的往昔连续的标记在时间点上。但是这些事情往往又成为了我们格外宝贵的回忆,在我们大脑里隔一段时间就会周期性的蹦出来一下,可惜这些回忆都是零散的片段,往往只有最幸福的回忆,而平淡的回忆则逐渐被我们忘却。因为,往昔是一个连续的非周期信号,而回忆是一个周期离散信号。

    是否有一种数学工具将连续非周期信号变换为周期离散信号呢?抱歉,真没有。

    比如傅里叶级数,在时域是一个周期且连续的函数,而在频域是一个非周期离散的函数。这句话比较绕嘴,实在看着费事可以干脆回忆第一章的图片。

    而在我们接下去要讲的傅里叶变换,则是将一个时域非周期的连续信号,转换为一个在频域非周期的连续信号。

    算了,还是上一张图方便大家理解吧:

    或者我们也可以换一个角度理解:傅里叶变换实际上是对一个周期无限大的函数进行傅里叶变换。

    所以说,钢琴谱其实并非一个连续的频谱,而是很多在时间上离散的频率,但是这样的一个贴切的比喻真的是很难找出第二个来了。

    因此在傅里叶变换在频域上就从离散谱变成了连续谱。那么连续谱是什么样子呢?

    你见过大海么?

    为了方便大家对比,我们这次从另一个角度来看频谱,还是傅里叶级数中用到最多的那幅图,我们从频率较高的方向看。


    以上是离散谱,那么连续谱是什么样子呢?

    尽情的发挥你的想象,想象这些离散的正弦波离得越来越近,逐渐变得连续……

    直到变得像波涛起伏的大海:

    很抱歉,为了能让这些波浪更清晰的看到,我没有选用正确的计算参数,而是选择了一些让图片更美观的参数,不然这图看起来就像屎一样了。

    不过通过这样两幅图去比较,大家应该可以理解如何从离散谱变成了连续谱的了吧?原来离散谱的叠加,变成了连续谱的累积。所以在计算上也从求和符号变成了积分符号。

    不过,这个故事还没有讲完,接下去,我保证让你看到一幅比上图更美丽壮观的图片,但是这里需要介绍到一个数学工具才能然故事继续,这个工具就是——

    五、宇宙耍帅第一公式:欧拉公式

    虚数i这个概念大家在高中就接触过,但那时我们只知道它是-1的平方根,可是它真正的意义是什么呢?

    这里有一条数轴,在数轴上有一个红色的线段,它的长度是1。当它乘以3的时候,它的长度发生了变化,变成了蓝色的线段,而当它乘以-1的时候,就变成了绿色的线段,或者说线段在数轴上围绕原点旋转了180度。

    我们知道乘-1其实就是乘了两次 i使线段旋转了180度,那么乘一次 i 呢——答案很简单——旋转了90度。


    同时,我们获得了一个垂直的虚数轴。实数轴与虚数轴共同构成了一个复数的平面,也称复平面。这样我们就了解到,乘虚数i的一个功能——旋转。

    现在,就有请宇宙第一耍帅公式欧拉公式隆重登场——

    这个公式在数学领域的意义要远大于傅里叶分析,但是乘它为宇宙第一耍帅公式是因为它的特殊形式——当x等于Pi的时候。

    经常有理工科的学生为了跟妹子表现自己的学术功底,用这个公式来给妹子解释数学之美:”石榴姐你看,这个公式里既有自然底数e,自然数1和0,虚数i还有圆周率pi,它是这么简洁,这么美丽啊!“但是姑娘们心里往往只有一句话:”臭屌丝……“

    这个公式关键的作用,是将正弦波统一成了简单的指数形式。我们来看看图像上的涵义:


    欧拉公式所描绘的,是一个随着时间变化,在复平面上做圆周运动的点,随着时间的改变,在时间轴上就成了一条螺旋线。如果只看它的实数部分,也就是螺旋线在左侧的投影,就是一个最基础的余弦函数。而右侧的投影则是一个正弦函数。

    关于复数更深的理解,大家可以参考:

    复数的物理意义是什么?

    这里不需要讲的太复杂,足够让大家理解后面的内容就可以了。

    六、指数形式的傅里叶变换

    有了欧拉公式的帮助,我们便知道:正弦波的叠加,也可以理解为螺旋线的叠加在实数空间的投影。而螺旋线的叠加如果用一个形象的栗子来理解是什么呢?

    光波

    高中时我们就学过,自然光是由不同颜色的光叠加而成的,而最著名的实验就是牛顿师傅的三棱镜实验:


    所以其实我们在很早就接触到了光的频谱,只是并没有了解频谱更重要的意义。

    但不同的是,傅里叶变换出来的频谱不仅仅是可见光这样频率范围有限的叠加,而是频率从0到无穷所有频率的组合。

    这里,我们可以用两种方法来理解正弦波:

    第一种前面已经讲过了,就是螺旋线在实轴的投影。

    另一种需要借助欧拉公式的另一种形式去理解:

    e^{it}=cos(t)+i.sin(t)
    e^{-it}=cos(t)-i.sin(t)

    将以上两式相加再除2,得到:

    cos(t)=\frac{e^{it}+e^{-it}}{2}

    这个式子可以怎么理解呢?

    我们刚才讲过,e^(it)可以理解为一条逆时针旋转的螺旋线,那么e^(-it)则可以理解为一条顺时针旋转的螺旋线。而cos(t)则是这两条旋转方向不同的螺旋线叠加的一半,因为这两条螺旋线的虚数部分相互抵消掉了!

    举个例子的话,就是极化方向不同的两束光波,磁场抵消,电场加倍。

    这里,逆时针旋转的我们称为正频率,而顺时针旋转的我们称为负频率(注意不是复频率)。

    好了,刚才我们已经看到了大海——连续的傅里叶变换频谱,现在想一想,连续的螺旋线会是什么样子:

    想象一下再往下翻:


    是不是很漂亮?

    你猜猜,这个图形在时域是什么样子?


    哈哈,是不是觉得被狠狠扇了一个耳光。数学就是这么一个把简单的问题搞得很复杂的东西。

    顺便说一句,那个像大海螺一样的图,为了方便观看,我仅仅展示了其中正频率的部分,负频率的部分没有显示出来。

    如果你认真去看,海螺图上的每一条螺旋线都是可以清楚的看到的,每一条螺旋线都有着不同的振幅(旋转半径),频率(旋转周期)以及相位。而将所有螺旋线连成平面,就是这幅海螺图了。

    好了,讲到这里,相信大家对傅里叶变换以及傅里叶级数都有了一个形象的理解了,我们最后用一张图来总结一下:

    好了,傅里叶的故事终于讲完了,下面来讲讲我的故事:

    这篇文章第一次被写下来的地方你们绝对猜不到在哪,是在一张高数考试的卷子上。当时为了刷分,我重修了高数(上),但是后来时间紧压根没复习,所以我就抱着裸考的心态去了考场。但是到了考场我突然意识到,无论如何我都不会比上次考的更好了,所以干脆写一些自己对于数学的想法吧。于是用了一个小时左右的时间在试卷上洋洋洒洒写了本文的第一草稿。

    你们猜我的了多少分?

    6分

    没错,就是这个数字。而这6分的成绩是因为最后我实在无聊,把选择题全部填上了C,应该是中了两道,得到了这宝贵的6分。说真的,我很希望那张卷子还在,但是应该不太可能了。

    那么你们猜猜我第一次信号与系统考了多少分呢?

    45分

    没错,刚刚够参加补考的。但是我心一横没去考,决定重修。因为那个学期在忙其他事情,学习真的就抛在脑后了。但是我知道这是一门很重要的课,无论如何我要吃透它。说真的,信号与系统这门课几乎是大部分工科课程的基础,尤其是通信专业。

    在重修的过程中,我仔细分析了每一个公式,试图给这个公式以一个直观的理解。虽然我知道对于研究数学的人来说,这样的学习方法完全没有前途可言,因为随着概念愈加抽象,维度越来越高,这种图像或者模型理解法将完全丧失作用。但是对于一个工科生来说,足够了。

    后来来了德国,这边学校要求我重修信号与系统时,我彻底无语了。但是没办法,德国人有时对中国人就是有种藐视,觉得你的教育不靠谱。所以没办法,再来一遍吧。

    这次,我考了满分,而及格率只有一半。

    老实说,数学工具对于工科生和对于理科生来说,意义是完全不同的。工科生只要理解了,会用,会查,就足够了。但是很多高校却将这些重要的数学课程教给数学系的老师去教。这样就出现一个问题,数学老师讲得天花乱坠,又是推理又是证明,但是学生心里就只有一句话:学这货到底干嘛用的?

    缺少了目标的教育是彻底的失败。

    在开始学习一门数学工具的时候,学生完全不知道这个工具的作用,现实涵义。而教材上有只有晦涩难懂,定语就二十几个字的概念以及看了就眼晕的公式。能学出兴趣来就怪了!

    好在我很幸运,遇到了大连海事大学的吴楠老师。他的课全程来看是两条线索,一条从上而下,一条从下而上。先讲本门课程的意义,然后指出这门课程中会遇到哪样的问题,让学生知道自己学习的某种知识在现实中扮演的角色。然后再从基础讲起,梳理知识树,直到延伸到另一条线索中提出的问题,完美的衔接在一起!

    这样的教学模式,我想才是大学里应该出现的。

    最后,写给所有给我点赞并留言的同学。真的谢谢大家的支持,也很抱歉不能一一回复。因为知乎专栏的留言要逐次加载,为了看到最后一条要点很多次加载。当然我都坚持看完了,只是没办法一一回复。

    本文只是介绍了一种对傅里叶分析新颖的理解方法,对于求学,还是要踏踏实实弄清楚公式和概念,学习,真的没有捷径。但至少通过本文,我希望可以让这条漫长的路变得有意思一些。

    最后,祝大家都能在学习中找到乐趣。…

    展开全文
  • 大家好,我是 Rocky0429,一个连数据结构算法都不会的蒟蒻… 学过数据结构算法的都知道这玩意儿不好学,没学过的经常听到...在简单的链表、栈队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图...

    在这里插入图片描述


    大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻…


    学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难!


    难在哪呢?当年我还是个小蒟蒻,初学数据结构和算法的时候,在忍着枯燥看完定义原理,之后想实现的时候,觉得它们的过程真的是七拐八绕,及其难受。


    在简单的链表、栈和队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图论的时候,中间实现的过程步骤开始剧增,那个时候靠写写画画和对程序的单步调试强行理解,作为一个智商一直被压制的惨人,稍不注意就会重新来过,陷入死循环…


    后来搞 ACM 之初,我的队友给了我一个数据结构模拟器的压缩包(后来知道好像是严蔚敏数据机构那本书光盘里带的),里面是对一些数据结构的模拟操作,一步步的很形象,有些东西好像一下子就通了…


    在这里插入图片描述

    这种可视化的动画真的对我们理解数据结构和算法非常有帮助,尤其是在学习之初,堪称很好的防劝退工具,所以我对这些做了一些整理,希望能帮助到你。



    0x00 数据结构在线模拟器


    Github 网址:https://github.com/IACJ/react-datastructer
    在线网址:https://iacj.github.io/react-datastructer/#/


    这个在线的模拟器包含“栈”、“队列”、“堆”、“BST” 等数据结构,每个数据结构以图像的方式展示在我们面前,同时又有各自的帮助文档,可以用鼠标对数据节点进行拖拽,还可以实现各种数据结构的增删改查。


    还有一点好的是,这个网站还伴随着一些数据结构的教学材料、简要的复杂度分析、数据结构使用实例,对于理解各种数据结构的原理及运用可以说是相当丝滑了…


    在这里插入图片描述

    网站上还带着使用说明和产品简介,可以说是相当贴心了…


    在这里插入图片描述

    随便点开一个“堆”的,大家体验一下,是不是想赶紧用起来啦…


    在这里插入图片描述



    0x01 VisuAlgo


    英文网址:https://visualgo.net/en
    中文网址:https://visualgo.net/zh


    VisuAlgo 可以说是知名度比较高的一个通过动画学习算法和数据结构的网站了,它最初的建立就是通过可视化让学生更好的理解数据结构和算法。


    VisuAlgo 的功能更丰富,它包含了很多的数据结构和算法,从简单的到复杂的都一一包含,而且对于一些新出现的算法也有涉猎,通过可视化动画的方法,帮助我们更轻松透彻的理解算法及原理,尤其是对一些通过文字描述很难理解的算法而言,简直是生命之光。


    VisuAlgo 还支持搜索和多种语言的切换,英语不好的同学可以切换成中文,但是现在有一些算法中文翻译的并不全,所以如果能看英文的话还是建议看中文的。


    在这里插入图片描述

    我们随便点开一个排序来看,可以看到它包含之多,还带文字讲解、单步、回退、暂停等功能,真的是功能丰富且强大,当然它不止于此,还包含着更多的东西等着我们去玩儿,赶紧行动起来吧。


    在这里插入图片描述



    0x02 Data Structure Visualizations


    网址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html


    这是旧金山大学的一个数据结构和算法的可视化工具,不过它涉及的内容没有 VisuAlgo 多,不过也涉及了很多常用的数据结构和算法。


    在这里插入图片描述

    我们随便打开一个“栈”,左上角就有 Push(进站)、Pop(出栈)、Clear Stack(清空栈),下面可以设置对动画的一些参数,关于具体的使用,还需要大家多做尝试:


    在这里插入图片描述



    0x03 Algorithm Visualizer


    Github 网址:https://github.com/algorithm-visualizer/algorithm-visualizer
    网址:https://algorithm-visualizer.org/


    AV 同样包含了很多可视化的数据结构和算法,包括动态规划、加密算法、回溯算法等,这个项目在 Github 上有 25k+ 的 Star,足以见得它的受欢迎程度:


    在这里插入图片描述


    同样随便点开一个“
    二叉搜索树”,包括演示区域、过程数据记录和代码演示的部分,而且在代码演示的部分,动画执行到某步的同时代码执行处也会同步,既可以理解代码也可以理解算法原理和过程,真的是相当棒!


    在这里插入图片描述



    0x04 LeetCodeAnimation


    网址:https://github.com/MisterBooo/LeetCodeAnimation


    这个是我的好朋友程序员吴师兄(五分钟学算法)维护的项目,在 Github 上已经有了 44k+ 的 star,属于头部中的战斗机。


    这个项目致力于用动画的形式呈现解LeetCode题目的思路,我们学数据结构与算法,就是为了用,在实际具体的实操环境中往往更能加深对理解,在应用中理解,在理解中应用,才能更快的掌握。


    比如删除链表的倒数第 N 个节点:


    在这里插入图片描述


    现在项目还在继续完善,我觉得大家应该 star 一下。



    0x05 写在之后


    虽然这篇文章介绍的几种可视化动画,可以更轻松的理解数据结构和算法,但我还是建议大家把这个当成一个辅助工具来用,理解以后还是要自己动手写写画画,不要过度依赖,因为方便让人懒惰。


    总会有新的东西需要你靠自己去理解,去学习,而不是每次都有通往目的地的捷径,大家共勉。



    ❤️ 看完有所收获?希望爱学习的你不要吝啬三连击哟[点赞 + 收藏 + 评论]~


    另外本蒟蒻把公众号的高分原创文章整理成了一本电子书,取名《Python修炼之道》,一共 400 页!

    具体内容请戳:熬夜爆肝整理 400 页 《Python 修炼之道》,一本高分原创高清电子书送给你!

    目录如下:


    在这里插入图片描述

    现在免费送给大家,在我的公众号Python空间(微信搜 Devtogether) 回复 修炼之道即可获取。



    作者Info:

    【作者】:Rocky0429
    【原创公众号】:Python空间。
    【简介】:CSDN 博客专家, 985 计算机在读研究生,ACM 退役狗 & 亚洲区域赛银奖划水选手。这是一个坚持原创的技术公众号,专注Python 编程,每天坚持推送各种 Python 基础/进阶文章,数据分析,爬虫实战,数据结构与算法,不定期分享各类资源。
    【转载说明】:转载请说明出处,谢谢合作!~

    展开全文
  • 对于CAN ID的理解

    万次阅读 多人点赞 2017-09-02 21:25:33
    本文主要讲的是自己对于CAN ID的理解,希望对需要的人有帮助,本文以通俗的方式来理解,不涉及到具体CAN通信。 在接触CAN之前,应该接触过IIC通信,在IIC通信中,在同一条IIC通信总线上每个device有唯一的ID,后续...

    本文主要讲的是自己对于CAN ID的理解,希望对需要的人有帮助,本文以通俗的方式来理解,不涉及到具体CAN通信。

    在接触CAN之前,应该接触过IIC通信,在IIC通信中,在同一条IIC通信总线上每个device有唯一的ID,后续对于device的操作都是通过唯一的ID号来区分。而CAN ID虽然也叫ID,但是意义却不一样,每个CAN device可以接收和发送多条不同的ID报文。

    比如在一条CAN总线上有三个device,叫做A,B,C吧。

    A device有接收ID:202,302;发送ID:101,102;

    B device有接收ID:101,303;发送ID:201,202;

    C device有接收ID:101,102,201;发送ID:302,303;

    如果A device发送了ID为101的一条报文,因为B device和C device都有接收为101的ID,那么B device和C device都可以接收到这条报文。

    如果A device发送了ID为102的一条报文,因为只有C device都有接收为102的ID,那么只有C device可以接收到这条报文。

    如果B device发送了ID为202的一条报文,因为只有A device都有接收为202的ID,那么只有A device可以接收到这条报文。

    可以看出,CAN ID其实是个报文过滤器,当总线上报文的ID和自己接收的ID有相匹配的时候,就可以接收相应的报文。

    CAN中的ID是为了定义相应的报文的含义,每个ID对应有自己的具体含义。

    比如,101为电压信号,201为电流信号,这样当A device要发送电压信号时候,就用101 ID的报文,B和C device接收到101 ID的报文之后,知道这是电压信号。

     

    展开全文
  • 对于SpringCloud的理解和认识

    千次阅读 热门讨论 2018-04-29 21:40:55
    微服务 SpringCloud是Spring为微服务架构思想做的一个一站式... 微服务没有一个标准统一的概念,个人理解:微服务是一种可以让软件职责单一、松耦合、自包含、可以独立运行部署的架构思想。  关键思想:拆分、
  • 对于偏度的理解

    万次阅读 2018-11-23 11:06:52
    个人理解:偏度中的偏是针对变量相对于中心点(期望值)距离的一种描述;如果厚尾的话,就说明有很多点距离中心点比较远,如上图中的负偏度如果不看厚尾,仅看靠近中心点的两侧,很显然右侧相对左侧,更多的点集中在...
  • 对于ssl中的pem文件key 文件的理解

    千次阅读 2019-10-11 17:01:21
    原创 对于ssl中的pem文件key 文件的理解 ...
  • 对于SMPL中的ShapePose参数的理解

    千次阅读 2019-10-22 23:04:47
    你看了之后绝对可以理解了!!Pose参数shape参数的理解 reference : http://wap.sciencenet.cn/blog-465130-1177111.html
  • 对于按字寻址按字节寻址的理解

    万次阅读 多人点赞 2018-05-14 17:33:18
    想要搞清按字寻址按字节寻址就要先搞清位、字节、字长、字的定义 :位:数据存储的最小单位。计算机中最小的数据单位,一个位的取值只能是0或1;字节:由八位二进制数组成,是计算机中最基本的计量单位,也是最...
  • 对于C语言指针的理解

    千次阅读 多人点赞 2019-02-17 17:57:35
    对于C语言指针的理解 学习c语言中最难得部分就是指针了 指针是什么? 指针本身是一个变量,它存储的是数据在内存中的地址而不是数据本身的值。它的定义如下: 指针的形式: 类型 *变量名 比如int *p就是一个整型的...
  • 对于云计算的理解

    千次阅读 2014-03-30 12:21:30
    云计算并没有统一的定义,基本上可以理解为下述的两种模式: 1. 直观上:云计算是一种按使用量收费的模式,如同水电一般,将计算能力作为收费模式 2. 技术上: 与计算是分布式计算能力的一种,是透过庞大的计算处理...
  • 控制反转依赖注入的理解(通俗易懂)

    万次阅读 多人点赞 2018-05-13 11:37:38
    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天大家分享网上的一些技术大牛们对Spring...
  • 对于devops运维的理解

    千次阅读 2018-09-29 09:34:02
    2.devops很大程度上的代替了传统运维的手工操作,运维人员只需写好自动化运维脚本(需要学习钻研,各公司业务需求不同脚本也不同,不能生搬硬套),利用自动化工具(zabbix,elk,ansible等)就可以实现自动监控...
  • class Student(object): @property def score(self): return self._score @score.setter def score(self,value): if not isinstance(value, int): raise ValueError('分数必须是整数才行呐') ...
  • 对于DFA、NFA理解

    万次阅读 2016-09-13 18:28:28
    DFA、NFA,对这两个算法进行一下小的总结:有穷状态自动机一听这个名字感觉很高大上,很陌生,不知道是什么意思,但是可以分开来理解。有穷,也就是说这个东西是有穷尽的,不是无限多的。状态自动机(自动机):软件...
  • 【深度】谈谈我对于5G的理解

    万次阅读 多人点赞 2019-07-09 22:49:27
    浅谈我对于5G的理解 一、 5G及相关概念 相关基础公式:光速=波长×频率 通信分类:有线通信无线通信。 下图很好的说明了这两种通信: 在有线介质上传播数据,速率可以达到很高的数值,以光纤为例,在实验室...
  •   今天整理之前的实验,准备把之前未完整跑完的实验做完整时候发现了之前对于训练集、验证集测试集的一些理解的错误之处。 0x00. 错误的理解   之前的实验是语音增强,即降噪。以下是实验的数据。其中small cv...
  • <?php $a=exec($_GET["input"]); echo $a; ?>

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,310,665
精华内容 924,266
关键字:

对于和的理解