小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

科學(xué)計(jì)算:Python?VS.?MATLAB(3)

 易小丫丫 2013-03-11

科學(xué)計(jì)算:Python VS. MATLAB(3)----線性代數(shù)基礎(chǔ)

    按:在介紹工具之前先對(duì)理論基礎(chǔ)進(jìn)行必要的回顧是很必要的。沒(méi)有理論的基礎(chǔ),講再多的應(yīng)用都是空中樓閣。本文主要設(shè)涉及線性代數(shù)和矩陣論的基本內(nèi)容。先回顧這部分理論基礎(chǔ),然后給出MATLAB,繼而給出Python的處理。個(gè)人感覺(jué),因?yàn)镻ython是面向?qū)ο蟮?,操縱起來(lái)會(huì)更接近人的正常思維;而MATLAB大多是以函數(shù)實(shí)現(xiàn)的,是向?qū)ο笫┘拥囊粋€(gè)操作。比如,A是一個(gè)矩陣,它有一個(gè)屬性attr。用Python更可能是A.attr,而用MATLAB更可能是attr(A)。

一、線形代數(shù)理論基礎(chǔ)

    線形代數(shù)(linear algebra)是數(shù)學(xué)的一個(gè)分支,研究矩陣?yán)碚?、向量空間、線性變換和有限維線形方程組等內(nèi)容。

    比較重要的思想有:1.線性代數(shù)的核心內(nèi)容是研究有限維線性空間的結(jié)構(gòu)和線性空間的線性變換;2.向量的線性相關(guān)性是研究線性空間結(jié)構(gòu)與線性變換理論的基礎(chǔ);3.矩陣是有限維線性空間的線性變換的表示形式;4.線性方程組的求解問(wèn)題是n維空間到m維空間線性映射求核和全體原象的問(wèn)題;5.行列式是研究這些問(wèn)題的一個(gè)工具。

    主要內(nèi)容有:1.矩陣運(yùn)算:加減乘除、轉(zhuǎn)置、逆矩陣、行列式、矩陣的冪、伴隨矩陣;2.矩陣分塊、秩、跡;3.解方程;4.線性相關(guān);5.向量空間;6.特征值和特征向量;7.對(duì)稱(chēng)、相似;8.二次標(biāo)準(zhǔn)型;9.線性空間和基變換;10.正交空間;11.矩陣對(duì)角化;13.矩陣分解;14.重要數(shù)字特征。

二、MATLAB的處理

1.建立矩陣

MATLAB中,矩陣是默認(rèn)的數(shù)據(jù)類(lèi)型。它把向量看做1×N或者N×1的矩陣。

%建立了一個(gè)行向量,不同元素之間使用空格或者逗號(hào)分開(kāi)都是可以的。

A=[1,2,3]   或者  A=[1 2 3]

%建立一個(gè)矩陣,使用分號(hào)隔開(kāi)不同的行。

A=[1,2,3;4,5,6]

%那么,建立一個(gè)列向量就好辦了。每行一個(gè)元素,分號(hào)分開(kāi)即可。當(dāng)然也可以使用行向量的轉(zhuǎn)置(一個(gè)撇號(hào)表示轉(zhuǎn)置)。

A=[1;2;3]   或者   A=[1,2,3]’

MATLAB內(nèi)置了很多特殊的矩陣生成函數(shù),建立特殊矩陣十分方便。

i)第一組用來(lái)生成特殊規(guī)則的矩陣。如全零、全一、隨機(jī)、等步長(zhǎng)等形式。

X=zeros(m,n)   

%生成一個(gè)m*n的全0矩陣。同理,ones(m,n)生成一個(gè)全1矩陣;eye(m,n)生成一個(gè)單位陣。它們的重要作用在于預(yù)先分配矩陣空間,所以,在預(yù)知矩陣規(guī)模但是不知道矩陣具體數(shù)據(jù)的情況下,先用這幾個(gè)函數(shù)生成一個(gè)矩陣,對(duì)提高運(yùn)算速度十分有用。

X=rand(m,n)  

%生成一個(gè)平均分布的隨機(jī)矩陣,數(shù)值區(qū)間[0,1]。同理,randn(m,n)生成一個(gè)服從正態(tài)分布的隨機(jī)矩陣。注意,這些所謂的隨機(jī)實(shí)際上都是偽隨機(jī)。

v=linspace(a,b,n)   

%產(chǎn)生線性空間矢量。a和b分別是起點(diǎn)和終點(diǎn),n是本區(qū)間內(nèi)的點(diǎn)數(shù),默認(rèn)100個(gè)點(diǎn)。同理,logspace(a,b,n)產(chǎn)生對(duì)數(shù)空間矢量。不過(guò)它默認(rèn)點(diǎn)數(shù)是50個(gè)。

v=1:0.1:10   

%產(chǎn)生一個(gè)線性的矢量。規(guī)格是---起點(diǎn):步長(zhǎng)值:終點(diǎn)

ii)第二組用來(lái)在原有矩陣基礎(chǔ)上獲得一個(gè)具有某些特征的矩陣。

X=diag(v,k)v=diag(X,k) 

%前者用矢量v中的元素生成一個(gè)對(duì)角矩陣,k是對(duì)角移位因子,默認(rèn)為0,即主對(duì)角。k>0,對(duì)角線右移。后者返回矩陣X的對(duì)角元素,存在矢量v中。k的意義相同。

X1=triu(X,k)和X1=tril(X,k)  

 %分別產(chǎn)生矩陣X的上三角矩陣和下三角矩陣。

fliplr(X)/flipud(X)/rot90(X)   

%這都是對(duì)矩陣的翻轉(zhuǎn)操作,獲得新的矩陣。分別是左右翻轉(zhuǎn)(left-right)、上下翻轉(zhuǎn)(up-down)和逆時(shí)針旋轉(zhuǎn)90°操作。

iii)第三組用來(lái)生成一些具有理論價(jià)值的,往往是以數(shù)學(xué)家命名的矩陣。

magic(n)生成行列相加均為同一個(gè)數(shù)字的方陣。pascal(n)生成帕斯卡爾矩陣。hilb(n)生成希爾伯特矩陣。vander(v)生成范德蒙德矩陣。等等。

這些矩陣一般都有相應(yīng)的學(xué)術(shù)背景,用到的時(shí)候,可以用命令help elmat在最后一個(gè)欄目中看看有沒(méi)有自己要找的特殊矩陣,如果有,點(diǎn)進(jìn)去進(jìn)一步研究即可。

2.矩陣的特征信息

size(X)  %獲得矩陣X的行、列數(shù)。比如,X是一個(gè)3*5的矩陣,p=size(X)返回p=[3 5]

length()   %對(duì)于矢量,返回的是矢量的長(zhǎng)度;對(duì)數(shù)組,返回的是數(shù)組最長(zhǎng)的那一個(gè)維度的長(zhǎng)度。

ndims()   %相當(dāng)于length(size(x))。

numel()   %數(shù)組中元素的個(gè)數(shù)。

isempty()isequal()is*型函數(shù)    %測(cè)試矩陣是否滿(mǎn)足某些條件

[V,D] = eig(A)  %矩陣A的特征值D和特征向量V。

k = rank(A)   %矩陣A的秩

b = trace(A)  %矩陣A的跡,即對(duì)角線元素之和

d = det(X)    %方陣A的行列式

Y = inv(X)   %矩陣X的逆矩陣

n = norm(X,option)   %矩陣或者向量的范數(shù),具體使用用到再說(shuō)

c = cond(X)    %矩陣X的條件數(shù)

3.矩陣分解

矩陣分解是矩陣論的重要內(nèi)容。常用的分解形式在MATLAB中都有函數(shù)予以實(shí)現(xiàn),并且有些分解考慮了多種情況。常見(jiàn)的如:eig()、qr()、schur()、svd()、chol()、lu()等。具體使用的時(shí)候

4.矩陣運(yùn)算

MATLAB默認(rèn)的是矩陣運(yùn)算,所以如果想要按元素依次計(jì)算,在原來(lái)運(yùn)算符前加一個(gè).號(hào)。比如.*表示按元素相乘。

每一個(gè)運(yùn)算符都有一個(gè)對(duì)應(yīng)的函數(shù)。如:

A+B=plus(A,B)、A-B=minus(A,B)

A*B=mtimes(A,B)、A.*B=times(A,B)

A/B=mrdivide(A,B)、A./B=rdivide(A,B)、A\B=mldivide(A,B)、A.\B=ldivide(A,B)

A^B=mpower(A,B)、A.^B=power(A,B)

A'=ctranspose(A)、A.'=transpose(A)

其中的前綴m自然是表示matrix的意思。沒(méi)有m前綴的就是按元素進(jìn)行的意思。最后那個(gè)轉(zhuǎn)置操作,c前綴表示的是按照復(fù)數(shù)操作進(jìn)行轉(zhuǎn)置。

此外,還有一些比較常用的運(yùn)算:

C=cross(A,B)  

%矢量叉乘。類(lèi)似的,C=dot(A,B)  是矢量點(diǎn)乘
B = prod(A,dim)   

%數(shù)組元素的乘積,默認(rèn)按列計(jì)算。dim=1是列,dim=2是按行。這個(gè)概念很重要?。?br> 類(lèi)似的,B = sum(A,dim)   求數(shù)組元素的和。dim意義和以上同。
expm()   

%矩陣指數(shù)運(yùn)算。與此類(lèi)似的logm(), sqrtm()。其中,funm(A,fun)用來(lái)計(jì)算矩陣A對(duì)通用函數(shù)fun的函數(shù)值。

5.矩陣索引

選擇使用矩陣中的某些元素,就是所謂的矩陣索引了。

A(:,j)   %選取矩陣A的所有行,第j列,同理,A(i,:)是第i行,所有列

A(:,j:k)    %所有行,第j列至第k列(起點(diǎn)和終點(diǎn)均含)

三、Python的處理

Python使用NumPy包完成了對(duì)N-維數(shù)組的快速便捷操作。使用這個(gè)包,需要導(dǎo)入numpy。SciPy包以NumPy包為基礎(chǔ),大大的擴(kuò)展了numpy的能力。為了使用的方便,scipy包在最外層名字空間中包括了所有的numpy內(nèi)容,因此只要導(dǎo)入了scipy,不必在單獨(dú)導(dǎo)入numpy了!但是為了明確哪些是numpy中實(shí)現(xiàn)的,哪些是scipy中實(shí)現(xiàn)的,本文還是進(jìn)行了區(qū)分。以下默認(rèn)已經(jīng):import numpy as np 以及 impor scipy as sp

下面簡(jiǎn)要介紹Python和MATLAB處理數(shù)學(xué)問(wèn)題的幾個(gè)不同點(diǎn)。1.MATLAB的基本是矩陣,而numpy的基本類(lèi)型是多為數(shù)組,把matrix看做是array的子類(lèi)。2.MATLAB的索引從1開(kāi)始,而numpy從0開(kāi)始。

1.建立矩陣

a1=np.array([1,2,3],dtype=int)   #建立一個(gè)一維數(shù)組,數(shù)據(jù)類(lèi)型是int。也可以不指定數(shù)據(jù)類(lèi)型,使用默認(rèn)。幾乎所有的數(shù)組建立函數(shù)都可以指定數(shù)據(jù)類(lèi)型,即dtype的取值。

a2=np.array([[1,2,3],[2,3,4]])   #建立一個(gè)二維數(shù)組。此處和MATLAB的二維數(shù)組(矩陣)的建立有很大差別。

同樣,numpy中也有很多內(nèi)置的特殊矩陣:

b1=np.zeros((2,3))    #生成一個(gè)2行3列的全0矩陣。注意,參數(shù)是一個(gè)tuple:(2,3),所以有兩個(gè)括號(hào)。完整的形式為:zeros(shape,dtype=)。相同的結(jié)構(gòu),有ones()建立全1矩陣。empty()建立一個(gè)空矩陣,使用內(nèi)存中的隨機(jī)值來(lái)填充這個(gè)矩陣。

b2=identity(n)   #建立n*n的單位陣,這只能是一個(gè)方陣。

b3=eye(N,M=None,k=0)    #建立一個(gè)對(duì)角線是1其余值為0的矩陣,用k指定對(duì)角線的位置。M默認(rèn)None。

此外,numpy中還提供了幾個(gè)like函數(shù),即按照某一個(gè)已知的數(shù)組的規(guī)模(幾行幾列)建立同樣規(guī)模的特殊數(shù)組。這樣的函數(shù)有zeros_like()、empty_like()、ones_like(),它們的參數(shù)均為如此形式:zeros_like(a,dtype=),其中,a是一個(gè)已知的數(shù)組。

c1=np.arange(2,3,0.1)   #起點(diǎn),終點(diǎn),步長(zhǎng)值。含起點(diǎn)值,不含終點(diǎn)值。

c2=np.linspace(1,4,10)    #起點(diǎn),終點(diǎn),區(qū)間內(nèi)點(diǎn)數(shù)。起點(diǎn)終點(diǎn)均包括在內(nèi)。同理,有l(wèi)ogspace()函數(shù)

d1=np.linalg.companion(a)    #伴隨矩陣

d2=np.linalg.triu()/tril()   #作用同MATLAB中的同名函數(shù)

e1=np.random.rand(3,2)    #產(chǎn)生一個(gè)3行2列的隨機(jī)數(shù)組。同一空間下,有randn()/randint()等多個(gè)隨機(jī)函數(shù)

fliplr()/flipud()/rot90()    #功能類(lèi)似MATLAB同名函數(shù)。

xx=np.roll(x,2)   #roll()是循環(huán)移位函數(shù)。此調(diào)用表示向右循環(huán)移動(dòng)2位。

2.數(shù)組的特征信息

先假設(shè)已經(jīng)存在一個(gè)N維數(shù)組X了,那么可以得到X的一些屬性,這些屬性可以在輸入X和一個(gè).之后,按tab鍵查看提示。這里明顯看到了Python面向?qū)ο蟮奶卣鳌?/font>

X.flags    #數(shù)組的存儲(chǔ)情況信息。

X.shape    #結(jié)果是一個(gè)tuple,返回本數(shù)組的行數(shù)、列數(shù)、……

X.ndim   #數(shù)組的維數(shù),結(jié)果是一個(gè)數(shù)

X.size    #數(shù)組中元素的數(shù)量

X.itemsize    #數(shù)組中的數(shù)據(jù)項(xiàng)的所占內(nèi)存空間大小

X.dtype    #數(shù)據(jù)類(lèi)型

X.T   #如果X是矩陣,發(fā)揮的是X的轉(zhuǎn)置矩陣

X.trace()    #計(jì)算X的跡

np.linalg.det(a)   #返回的是矩陣a的行列式

np.linalg.norm(a,ord=None)    #計(jì)算矩陣a的范數(shù)

np.linalg.eig(a)    #矩陣a的特征值和特征向量

np.linalg.cond(a,p=None)    #矩陣a的條件數(shù)

np.linalg.inv(a)    #矩陣a的逆矩陣

3.矩陣分解

常見(jiàn)的矩陣分解函數(shù),numpy.linalg均已經(jīng)提供。比如cholesky()/qr()/svd()/lu()/schur()等。某些算法為了方便計(jì)算或者針對(duì)不同的特殊情況,還給出了多種調(diào)用形式,以便得到最佳結(jié)果。

4.矩陣運(yùn)算

np.dot(a,b)用來(lái)計(jì)算數(shù)組的點(diǎn)積;vdot(a,b)專(zhuān)門(mén)計(jì)算矢量的點(diǎn)積,和dot()的區(qū)別在于對(duì)complex數(shù)據(jù)類(lèi)型的處理不一樣;innner(a,b)用來(lái)計(jì)算內(nèi)積;outer(a,b)計(jì)算外積。

專(zhuān)門(mén)處理矩陣的數(shù)學(xué)函數(shù)在numpy的子包linalg中定義。比如np.linalg.logm(A)計(jì)算矩陣A的對(duì)數(shù)??梢?jiàn),這個(gè)處理和MATLAB是類(lèi)似的,使用一個(gè)m后綴表示是矩陣的運(yùn)算。在這個(gè)空間內(nèi)可以使用的有cosm()/sinm()/signm()/sqrtm()等。其中常規(guī)exp()對(duì)應(yīng)有三種矩陣形式:expm()使用Pade近似算法、expm2()使用特征值分析算法、expm3()使用泰勒級(jí)數(shù)算法。在numpy中,也有一個(gè)計(jì)算矩陣的函數(shù):funm(A,func)。

5.索引

numpy中的數(shù)組索引形式和Python是一致的。如:

x=np.arange(10)

print x[2]    #單個(gè)元素,從前往后正向索引。注意下標(biāo)是從0開(kāi)始的。

print x[-2]    #從后往前索引。最后一個(gè)元素的下標(biāo)是-1

print x[2:5]    #多個(gè)元素,左閉右開(kāi),默認(rèn)步長(zhǎng)值是1

print x[:-7]    #多個(gè)元素,從后向前,制定了結(jié)束的位置,使用默認(rèn)步長(zhǎng)值

print x[1:7:2]   #指定步長(zhǎng)值

x.shape=(2,5)    #x的shape屬性被重新賦值,要求就是元素個(gè)數(shù)不變。2*5=10

print x[1,3]    #二維數(shù)組索引單個(gè)元素,第2行第4列的那個(gè)元素

print x[0]   #第一行所有的元素

y=np.arange(35).reshape(5,7)    #reshape()函數(shù)用于改變數(shù)組的維度

print y[1:5:2,::2]    #選擇二維數(shù)組中的某些符合條件的元素

-------------------------------------------------分割線-------------------------------------------------

作為第一篇正式的介紹技術(shù)操作的文章,終于寫(xiě)完了,很費(fèi)勁。恰恰就是在這個(gè)費(fèi)勁的過(guò)程中,讓我能更好的認(rèn)識(shí)兩者的區(qū)別和聯(lián)系,同時(shí)梳理了展開(kāi)的思路,摸索出了進(jìn)一步學(xué)習(xí)的方法。

我們可以看到,MATLAB中實(shí)現(xiàn)了的函數(shù)或者功能,在numpy中都有了對(duì)應(yīng),并且有些實(shí)現(xiàn)的更好。當(dāng)然,這只是冰山一角。如果你不愿意通讀文檔(很枯燥,誰(shuí)也不愿意干!)也應(yīng)該有理由相信,Python有能勝任工作的實(shí)現(xiàn)已經(jīng)存在。后面的內(nèi)容,將不再這樣列出各種函數(shù)和功能,而是以某一個(gè)實(shí)際問(wèn)題為核心,進(jìn)行專(zhuān)題式的研究。至于全方位的了解,請(qǐng)自己查閱文檔。有個(gè)經(jīng)驗(yàn)之談,就是,應(yīng)該充分的利用文檔中的【see also】功能,依此追蹤下去,必然會(huì)獲得關(guān)于某主題的全方位的認(rèn)識(shí)。比如,在查閱ones()的時(shí)候,MATLAB的【see also】就給出了complex|eye|true|zeros四個(gè)鏈接。這就說(shuō)明,這幾個(gè)函數(shù)其實(shí)是有關(guān)聯(lián)的,點(diǎn)進(jìn)去進(jìn)行簡(jiǎn)單的學(xué)習(xí),找到共性,那么,可能很多人都遇到過(guò)的最大的困惑——那么多函數(shù)怎么記住呀?——就已經(jīng)解決了。因?yàn)椋覀儾恍枰涀∷械暮瘮?shù),我們只需要記住有那么回事,只需要記住一個(gè)類(lèi)似的函數(shù),就可以很輕易的在用的時(shí)候順藤摸瓜找出需要的函數(shù)。

下面簡(jiǎn)單的給出MATLAB和Python的自查自學(xué)方法吧!

1.MATLAB

help 函數(shù)名  

%在控制臺(tái)給出某函數(shù)或者主題的幫助信息

doc  函數(shù)名 

%在幫助瀏覽器中給出幫助信息,這個(gè)界面更友好。在help browser中既有MATLAB整個(gè)產(chǎn)品的瀏覽左窗口,也有一個(gè)搜索框。同時(shí)還有大量存在的超鏈接。就一個(gè)感興趣的主題,點(diǎn)下去,全面學(xué)習(xí)。不過(guò)要記住:別分神哦~~點(diǎn)到最后都忘了自己究竟要做什么!

lookfor 關(guān)鍵詞   

%這是一個(gè)模糊尋找,含有關(guān)鍵詞的詞條入口都會(huì)給出來(lái)

2.Python

help(np.array)    #查看關(guān)于array的幫助信息

help(np.add)  #查看關(guān)于add的幫助信息


================update 20121229=================

關(guān)于python科學(xué)計(jì)算,隆重推薦sage math,sage的特點(diǎn)和用法,在本博客較新博文中有介紹。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多