天天看點

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

Abstract:

(最近一段時間看Lie代數,結合之前學過的泛函 、以及傅裡葉變換,突然對函數有一種特殊的了解。)

本文先提出函數

向量了解

的觀點(用

元組

的方式來表示),再帶入到其他理論中 中做一些闡述,最終以

傅裡葉變換

為例實作其基本功能。(附上

python代碼

以及相應

結果

目錄

  1. 函數到向量
  2. 在其他理論中的了解
  3. 傅裡葉變換的實作

函數到向量

說起來函數,很多人都有相應的了解,例如

1、正比例函數

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

正比例函數

2、一次函數

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

一次函數

3、二次函數

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

二次函數

當然,後面還有相應的指數函數(

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

),對數函數(

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

),正弦函數(

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

)等等。

對于其

描述

(我說的是描述,不是性質),可以有以下三個要素:

  1. 運算法則
  2. 定義域
  3. 值域

那和向量有什麼關系呢?

再說說

向量

一般對向量了解:就是帶有

大小和方向

的有向線段。

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

(2,3)

根據其相關性質,可以定義一個向量空間:域F上的一個模。

即,定義了加法和乘法 有一下8條成立(經過前人對大量事物的歸納總結得到)

  1. α+β=β+α,對任意α,β∈V.
  2. α+(β+γ)=(α+β)+γ,對任意α,β,γ∈V.
  3. 存在一個元素0∈V,對一切α∈V有α+0=α,元素0稱為V的零元.
  4. 對任一α∈V,都存在β∈V使α+β=0,β稱為α的負元素,記為-α.
  5. 對P中機關元1,有1α=α(α∈V).
  6. 對任意k,l∈P,α∈V有(kl)α=k(lα).
  7. 對任意k,l∈P,α∈V有(k+l)α=kα+lα.
  8. 對任意k∈P,α,β∈V有k(α+β)=kα+kβ,

對于這種抽象的定義,“向量”除了能夠表示一些實體量(力、速度)其實可以表示(不限于):

  • 空間向量(
    c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)
    c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)
  • 矩陣(
    c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)
  • 多項式(
    c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)
  • 函數(即本文重點)

先說說,函數怎麼樣被向量所

具體描述

的?

從有限開始,定義一個函數

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

要知道,該函數是定義在定義域為

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

的函數空間中,如果定義域中多(少)一個數(

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

)抑或是換一個數(

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

)都不再是

原來的向量空間

了。

那麼,上述函數用元組(序偶)來表示,可記為向量

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

在該空間的另一個函數

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

就可以寫作

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

定義域的

元素越多

,則向量的

次元越大

這樣,就很好了解無窮維向量:

譬如将定義域放在自然數({0}并上正整數)/整數/有理數上,就可以将上面的函數

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

記作(自然數下),

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

如果是整數的話,可以寫成

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

有理數(我隻寫非負有理數的吧)

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

由于實數不可列,隻能是說借助一個名額集

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

,對于該集合的

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

,假想那麼一個向量的位置,它是第

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

位的。

或者,若想将其“

列出來

”,需要借助

極限

的定義。将其在不可列的空間中商去一個

任意小的範圍

,使之能夠“

近似

”列舉出來。如封面的圖

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

是以,向量的次元取決與分割的粒度了。(如果也想要個無窮維的,可以将分割粒度設定為

兩個相鄰有理數間距的一半

。)

帶入其他理論中的了解

(此處會涉及一些數學高年級課程的内容)

上一節主要說了關于函數向量化的了解,那麼這裡就将這種了解帶入一些理論中進行簡單地闡述。由于本人時間有限,也就挑幾個比較重要的内容去講述。

數學分析(微積分)

數學分析主要講的是實函數上的内容,是以從較高的觀點上來看,有以下主要内容:

  • 極限
  • 微分(求導)
  • 積分
  • 多元部分

當然,對于非專業的,還會有微分方程。

1、

對于極限

實際上就是上面說的,一種近似表示。這個近似展現在什麼地方呢?就是:

對于未知的事物能否用已知來代替,且使意外可以忽略

這個代替,就是定義中,

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

中的

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

;而那個“意外可以忽略”,就是定義中一大坨的

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

這樣,也能了解所謂區間開閉要做什麼的吧(将的得不到的轉變成已擁有的)~

衆所周知,(以下加斜體字皆為

私貨

,請

酌情閱讀

吾生也有涯,而知也無涯 。以有涯随無涯,殆已!——《莊子.内篇.養生主其三》

相比于

莊子

的想法,可以保身,可以全生,可以養親,可以盡年,的這種“向内求穩”想法(既然未知無窮,那就停止思考,看着眼前也能過得挺好),能夠看出

Weierstrass

給出了一個“向外求穩”的方法(雖然未知無窮,但是讓我停止思考是不可能的,這輩子都不會不思考的!!!隻不過面對無窮,我隻會放棄思考那些等價于“有窮”的無窮罷了)。也可見中西方人文上的差異。當然對于想知道為什麼會這樣的人,可以上bilibili上看看(

北京大學

吳國盛 所講的 《科學史》。

2、

微分

實際上,這就相當于,調取一個一維數組中的一個數與下一各數的差,進而轉變成一個

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

維的向量。(這也就可以解釋為啥一些微分的定理,都是說“

閉區間連續,開區間可導

”的原因了吧,畢竟導完之後,閉區間就“

縮”

了一小段了~)

同樣,也能看出,微分是對函數——這個向量一個子空間的“

線性表示

”。(可以将高等代數中的

特征方程

與數學分析中的

微分定義

互相對比一下,你會有所發現的~)

于是乎,求導就是求特征方程的“

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

”。

不定積分就是求那個“

特征向量”

3、

(定)積分

積分呢,顧名思義,有了“積”(不是太美的那個ji),就能聯想到“内積”。對一個函數

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

做積分,就相當于将

一個向量與一個1向量做内積

(1向量是向量上所有分量全部為1)。兩個函數相乘做積分,就是

兩個向量做内積啦

~

進而,對于積分的一些性質,可以用高等代數中的正交空間來了解。(或者中積分)

對于級數來說,其實就是可以看做是離散化的積分。也是無窮維向量内積。不過,向量的角度也就隻能闡述一下數項級數。對于函數項級數,可以那

矩陣*向量

來看待。

4、

多元部分

西方人在了解自然時(科學),都有這麼一個習慣性思維:

先研究好最基本、最完美的事物,然後再用它來表示現實中複雜的東西

對于多元函數也不例外。所謂n維空間的東西,就是将其看做n條直線(1維空間)來了解的。

陸藝:微分幾何随記(六)淺談外微分形式​zhuanlan.zhihu.com

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

那麼相比于一階張量的向量來說,二進制函數不就再向外擴張一階——

矩陣

嗎,以此類推擴張下去。

(對這方面了解僅限于定義,相關例題做的少,是以就不多說了。。。)

在說完數分後,後面的理論我就挑幾個重點來說了。

實變函數

我個人對此了解比較多的是

可測函數

部分,對于積分這塊也就會證明幾道例題,算不上了解,是以就說兩句關于可測的了解。

按可測定義來看,就是要外側度滿足Caratheodry(卡拉西奧多裡)條件

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

為任意集合,

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

則為可測集)

而可測函數,就是:函數像在任意區間上的原像全部為可測集。

因為實變函數畢竟要研究實數軸上的,是以說需要引用一個

名額集
c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

來表示向量的每一個分量

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

對于可測函數,就相當于,随便找一個實數

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

,從向量中找出那些分量大于

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

的位置

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

,并将其打成包,然後看這個包是否滿足可測定義。

measure_set 
           

看該集合是否為可測集(python 文法)

在積分上,與黎曼積分的明顯

差異

在于:黎曼積分用

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

把函數按段分到了向量的每個分量中;而lebesgue是按像來做劃分的(對此處了解不是很深刻,可能會有疑義)。

泛函分析

在泛函分析中,就是在研究無窮維空間的東西了。在這個無窮維中,會有可數的

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

,或者不可數

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

,還有可以用“方向”來定義“大小”的(把前面那兩個p=2就行),也有不能的。

在一般向量空間中,所有的“函數”都隻是一般意義上的函數,沒有一個标準來衡量“函數”直接的差别。比如給你兩幅畫,如果都能用

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

個像素表示,那麼他們就都是

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)
維向量

,如何判斷它們倆之間的差别?

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

圖1,本人畫的,不存在侵權~~~

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

圖2

有句話說,公說公有理,婆說婆有理。

這個理,往往是一種度量。如果說,一個向量空間中,有了距離(它講道理了~)的概念,那麼,他就是

距離空間

。如果這個空間有了“原點”(有準了),就是

賦範空間

。如果Cauchy列收斂(靠譜了——就好比畫畫,畫了一堆線條,越畫越像就是

收斂

)就成了

Banach空間

。當然,如果該度量能夠通過

内積

來衡量不同方向的函數(就好比各種各樣的畫派,像什麼印象派、抽象派,還有什麼黃派、徐派等等,通過一種衡量方式,可以進行跨派别的評審),那就是

内積空間

。如果說,内積定義的範數Cauchy收斂(就是上述背景中,那種評審方式

很靠譜

了),那就是Hilbert空間。Hilbert空間有很多完美性質。

還有一句古話講,無規矩不成方圓。

通過前面講述能夠發現,很多都是已經有的對象(向量),之是以有各種各樣的空間,是因為他們所遵循的規矩不一樣。

回到數學中來看:

對于Hilbert空間,根據表現定理,

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

上的泛函一定能寫成内積的形式,且泛函的範數等于該空間中的向量,那也就是說明:泛函可以看做成這個樣子

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

像分解定理、還有lax-milgram定理,就不多闡述了。

如果不是内積空間,則有可能

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

像泛函和算子,可以分别當做向量和矩陣。根據他們範數的定義不難發現,就是觀察泛函/算子作用在機關閉球上的最大值。在計算時,就可以看成找一個機關向量,看泛函(算子作用後的向量範數)結果最大值是有多大。

如果有界《--》連續《--》逐點連續。也就不難了解了。

傅裡葉變換的實作

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

實際上,在

函數——向量

的了解下,傅裡葉變換就可以轉化稱為

矩陣右乘一個向量

的形式了。那積分上下限的無窮怎麼了解呢?實際上,函數如果區間有窮的畫,那把剩下的部分全部置零延拓出去,或者剩下的部分當做一個“常數”(收斂),按這個常數在正規化(通過對f的整體變換,使常數部分為0)。

該程式用python編寫,需要numpy庫,

剩下不多說了,直接貼代碼了

import numpy as np

def vec_e(omega):#定義了内積向量
    return np.array([np.cos(omega),np.sin(omega)]).T

def fourier(fun,x,t,):#指定頻域中頻率的傅裡葉變換
    '''fun is a n-dim vectors
    interval is 2-tuple show the end points of the interval
    t is frequency'''
    d = len(fun)
    result = np.array(fun).dot(vec_e(-np.linspace(x[0],x[-1],d)*t  ) )

    return (result*(x[-1]-x[0]))/(2*d)

def Fourier(fun,x,img_x,p,appr=3):#一段頻率,這裡用str是為了将資料輸出到excel畫圖用。
    return [ str(np.linalg.norm(np.around(fourier(fun,x,p*i),appr)))  for i in range(img_x[0],img_x[1])]
           

完整的測試代碼:

import numpy as np

def vec_e(omega):#定義了内積向量
    return np.array([np.cos(omega),np.sin(omega)]).T

def fourier(fun,x,t,):#指定頻域中頻率的傅裡葉變換
    '''fun is a n-dim vectors
    interval is 2-tuple show the end points of the interval
    t is frequency'''
    d = len(fun)
    result = np.array(fun).dot(vec_e(-np.linspace(x[0],x[-1],d)*t  ) )

    return (result*(x[-1]-x[0]))/(2*d)

def Fourier(fun,x,img_x,p,appr=3):#一段頻率,這裡用str是為了将資料輸出到excel畫圖用。
    return [ str(np.linalg.norm(np.around(fourier(fun,x,p*i),appr)))  for i in range(img_x[0],img_x[1])]

if __name__=='__main__':
#測試的sinx+2*sin3.2x
    x = np.linspace(-4*np.pi  ,4*np.pi,10000)
    y = np.sin(x)+2*np.sin(3.2*x)
    r = Fourier(y,x,[0,5000],0.002)

    with open('abc.csv','w') as file:
        for i in range(len(r)):
            file.write(str(i*0.002)+','+r[i]+'n')
           

結果,如圖

c++ 提取傅裡葉描述子_聊一聊【向量】視角下的函數(例子:傅裡葉變換)

從圖中能夠看出,頻率在1,和3.2的位置有特别明顯的欺負,且波峰長度為1:2。

(關于x軸上為何這麼多起起伏伏呢?如果把f的定義域調大點,起伏就少了。不過,這應該是一些技術性的問題了。)

關于一些代數、幾何層面上的含義我并沒有說的很細,主要還是說了如何将函數用向量的角度去了解的東西。

畢竟學識有限,有問題之處不吝賜教~

繼續閱讀