MATLAB学习笔记(二)
MATLAB學習筆記(二)
- 一、矩陣運算
- 矩陣分析
- 向量和矩陣的范數(shù)運算
- 矩陣的秩
- 矩陣的化零矩陣
- 矩陣的化簡rref()函數(shù)
- 線性方程組
- 超定線性方程組求解
- 矩陣分解
- 1.對稱正定矩陣的Cholessky分解
- 2、一般方陣的高斯消去法
- 矩形矩陣的正交分解(正交變換)
- 矩陣(方陣)的特征值和特征向量
- 二、MATLAB基本編程
- 腳本和函數(shù)
- 函數(shù)
- 腳本
- 函數(shù)與腳本的異同
- 子函數(shù)與私有目錄
- 特殊的控制語句
一、矩陣運算
矩陣分析
向量和矩陣的范數(shù)運算
使用的是norm函數(shù)以及normset函數(shù)
向量的范數(shù)定義:
∣∣x∣∣p=(∑i=1nxip)1/p||x||_p = (\sum_{i=1}^{n}{{x_i}^{p}})^{1/p}∣∣x∣∣p?=(i=1∑n?xi?p)1/p
上述定義就稱為 ∣∣x∣∣p||x||_p∣∣x∣∣p?稱為p階范數(shù)。其中最常用的就是1階、二階和 ∞\infty∞階。
啥意思呢。就好比一階范數(shù)
其實就是 ans=(31+41)1/1ans =(3^1+4^1)^{1/1}ans=(31+41)1/1
二價呢?
是不是很熟悉 ans=(32+42)1/2ans =(3^2+4^2)^{1/2}ans=(32+42)1/2
依次類推就可以了。
或許在這里你們會疑問,既然norm函數(shù)可以算二階范數(shù),為啥還要有normset函數(shù)呢?
其實normset函數(shù)是用來估計2階范數(shù)值得,當數(shù)據(jù)較大時用其數(shù)的結果和norm函數(shù)幾乎是一樣的,但時間卻快了很多!
- normset(S):估計矩陣的2階范數(shù),默認相對誤差是1e-6;
- normset(S,tol):使用tol作為允許的相對誤差。
矩陣的秩
最穩(wěn)定的算法:(不過也是最耗時的)
s = svd(A); tol = max(size(A)*eps(max(s)); r = sum(s>tol)-
svd函數(shù)是對SVD分解的實現(xiàn),SVD分解即是奇異值分解 (sigular value decomposition,SVD),它 是一種正交矩陣分解法,是最可靠的分解法。和它類似的有特征值分解。但是值得注意的是,特征值分解只能針對方陣,而對于非方陣是無法應用特征值分解的。正如我們了解的,特征值分解是將矩陣分解為由其特征值和特征向量表示的矩陣之積的方法。需要注意只有對可對角化矩陣才可以施以特征分解。正因為特征值分解的局限性,數(shù)學家才提出SVD分解來替代特征值分解在非方陣的應用。
-
首先matlab中eps是一個函數(shù),可以返回某一個數(shù)N的最小浮點數(shù)精度,形式例如eps(N)。eps(a)是|a|與大于|a|的最小的浮點數(shù)之間的距離,距離越小表示精度越高。
默認a=1,即eps = eps(1); 我們在matlab中敲入eps和eps(1)可以發(fā)現(xiàn)結果是一樣的。eps = eps(1) = 2.2204e-16。
函數(shù)rank()的用法:
- rank(A):用默認允許誤差計算矩陣的秩。
- rank(A,tol):在tol誤差內。
矩陣的化零矩陣
定義:若有矩陣Z使得A*Z的元素都為0,且矩陣Z為一個正交矩陣,則稱矩陣Z為矩陣A事務化零矩陣。
用法如下:
- Z = null(A):返回矩陣A的一個化零矩陣,不存在則返回空矩陣
- Z = null(A,'r'):返回有理數(shù)形式的化零矩陣。
矩陣的化簡rref()函數(shù)
在用MATLAB求解線性方程組的時候,可以使用 rref() 函數(shù)對矩陣進行化簡,從而很方便直觀的得到原方程的解,舉一個簡單的例子: 解下列線性方程組(應該是求矩陣的行最簡形式)
則用MATLAB的rref函數(shù)解上述方程組的代碼如下
運行結果為
ans =1 0 0 2/3 0 1 0 -4/3 0 0 1 1即原方程的解為x1=2/3 x2=-4/3 x3=1
線性方程組
- X =A\B :表示求矩陣方程AX=B的解
- X=B\A表示求矩陣方程XA=B的解
對于X =A\B,要求矩陣A和B有相同的行數(shù),X和B有相同的列數(shù),X的行數(shù)等于矩陣A的列數(shù)。X=B\A性質則相反。
一般求矩陣方程AX=B的解的情況比較多。
系數(shù)矩陣A是m×\times×n的矩陣,其中m是方程個數(shù),n是未知數(shù)個數(shù)。有如下三種情況:
- m = n :恰定方程組。方程個數(shù)與未知數(shù)個數(shù)一樣。(尋求精確值)
- m>n : 超定方程組 。方程個數(shù)大于未知數(shù)個數(shù)。(最小二乘解)
- m<n :欠定方程組。未知數(shù)個數(shù)大于方程個數(shù)。(尋求基本解)
超定線性方程組求解
一般在進行實驗數(shù)據(jù)擬合時,經(jīng)常遇到這種情況。
如有以下觀測數(shù)據(jù)
希望得到y=c1?x+c2?x2y=c1*x+c2*x^2y=c1?x+c2?x2的模型來擬合。可以用以下方法:
2.然后構造系數(shù)矩陣A
A(:,1) = x'; A(:,2) = x'.^2;3.此時方程組可以寫成:A?[c1c2]‘=yA*[c1 c2]` = yA?[c1c2]‘=y 然后用‘\’來求系數(shù)c1和c2。
c = A\y %就是 Ac = y得到:
畫出圖
矩陣分解
矩陣分解函數(shù)
| chol | Cholesky 分解 |
| cholinc | 稀疏矩陣的不完全Cholesky 分解 |
| lu | 矩陣LU分解 |
| qr | 正交三角分解 |
| svd | 奇異值分解 |
| schur | 舒爾止分解 |
在MATLAB7.0中,線性方程組的求解主要基于3種基本的矩陣分解,即對稱正定矩陣的Cholesky分解、一般方陣的高斯消去法和矩形矩陣的正交分解。這3種分解分別通過函數(shù)chol()、lu()和qr()實現(xiàn)。這3種分解都使用了三角矩陣的概念。若矩陣的所有對角線以下的元素為0,則稱為上三角矩陣;若矩陣的所有對角線以上的元素為0,則稱為下三角矩陣。
1.對稱正定矩陣的Cholessky分解
Cholesky分解是把一個對稱正定矩陣A表示為一個上三角矩陣R與其轉置的乘積,示例如下:
A=R′?RA=R′?RA=R′?R
然而,并不是所有的對稱矩陣都可以進行Cholessy分解。能進行Cholesky分解的矩陣必須是正定的,即矩陣的所有對角元素必須是正的,同時矩陣的非對角元素不會太大。
2、一般方陣的高斯消去法
使用lu()函數(shù)實現(xiàn):調用方法如下:
- [L,U] = lu(X): X為一個方陣,L為“心理”下三角矩陣,U為上三角矩陣,滿足關系X=L?U.
- [L U,PI=lu(X):X為一個方陣,L為下三角矩陣,U為上三角矩陣,P為置換矩陣,滿足關系 。P?X=L?U。
考慮線性方程組 AX=B, 其中,對矩陣A可以做LU分解,使得
A=L?U, 這樣線性方程組就可以改寫成 L?U?X=B,由于左除算符’'可以快速處理三角矩陣,因此可以快速解出:X=U(L\N)
矩陣的行列式的值和矩陣的逆也可以利用LU分解來計算,示例如下:
det(A)=det(D)?det(D)
inv(A)=inv(U)?inv(L)
矩形矩陣的正交分解(正交變換)
對矩陣X進行QR分解,就是把X分解為一個正交矩陣Q和一個上三角矩陣R的乘積形式。QR分解只能對方陣進行。MATLAB的函數(shù)qr可用于對矩陣進行QR分解,其調用格式為:
- [Q,R]=qr(X):產生一個一個正交矩陣Q和一個上三角矩陣R,使之滿足X=QR。
- [Q,R,E]=qr(X):產生一個一個正交矩陣Q、一個上三角矩陣R以及一個置換矩陣E,使之滿足XE=QR。
實現(xiàn)QR分解后,線性方程組Ax=b的解x=R(Qb)或x=E(R(Qb))。
矩陣(方陣)的特征值和特征向量
- d = eig(A) :返回矩陣A的所有特征值。
- [V,D] = eig(A):返回矩陣A的所有特征值和特征向量。
二、MATLAB基本編程
MATLAB作為一種廣泛應用于科學計算的工具軟件,不僅具有強大的數(shù)值計算、符號計算算、矩陣運算的能力和豐富的畫圖功能,還可以像C語言、FORTRAN等計算機高級語言-一樣進行程序設計,編寫擴展名為_m的M文件,實現(xiàn)各種復雜的運算,這使得l MATLAB 在科研中的應用更加深入,常常作為系統(tǒng)仿真的工具應用。
MATLAB提供文件編輯器和編譯器,這為用戶帶來了方便,事實上, MATLAB 自帶的許多函數(shù)就是M文件函數(shù),用戶也可利用M文件來生成和擴充自己的函數(shù)庫。
所謂M文件,簡單來說就是用戶把要實現(xiàn)的命令寫在一個以…m作為擴展名的文件中,然后由 MATLA 系統(tǒng)進行解釋,最后運行出結果。
腳本和函數(shù)
M文件有函數(shù)(Functions)和腳本(Scripts)兩種格式。二者相同之處在于它們都是以m作為擴展名的文本文件,不進入命令窗口,而是由文本編輯器來創(chuàng)建外部文本文件。但是兩者在語法和使用上略有區(qū)別。
函數(shù)
MATLAB中許多常用的函數(shù)(如sqrt、inv和abs等)都是函數(shù)式M文件,使用時, MATLAB獲取傳遞給它的變量,利用操作系統(tǒng)所給的輸入,運算得到要求的結果,然后返回這些結果。函數(shù)文件類似于一個黑箱,由函數(shù)執(zhí)行的命令以及這些命令所創(chuàng)建的中間變量都是隱含的。運算過程中的中間變量都是局部變量(除特別聲明外),存放在函數(shù)本身的工作空間內,不會和 MATLAB
基本工作空間(Base workspace)的變量相互覆蓋。(對比下形參就好理解了)
不能在命令行窗口創(chuàng)建
單擊新建,選擇函數(shù)即可
function語法:function [y1,…,yN] = myfun(x1,…,xM),其中[y1,…,yN]為輸出量,myfun為函數(shù)名,(x1,…,xM)為函數(shù)輸入量。有效的函數(shù)名稱以字母字符開頭,并且可以包含字母、數(shù)字或下劃線。
注意:
- 如果是多個返回參數(shù):function [y,z]= average(x)
- 函數(shù)文件中可以寫多個函數(shù),也可以互相調用。
腳本
腳本是一個擴展名為am的文件,其中包含了MATLAB的各種命令,與批處理文件很類似,在MATLAB命令窗口下直接輸入此文件的主文件名, MATLAB可逐一執(zhí)行在此文件內的所有命令,和在命令窗口逐行輸入這些命令一樣。
腳本式M文件運行產生的所有變量都是全局變量,運行腳本后,所產生的所有變量都駐留在MATLAB基本工作空間內,只要用戶不使用clear命令加以清除,且MATLAB指令窗口不關閉,這些變量將一直保存。基本空間隨MATLAB的啟動而產生,在關閉 MATLAB 軟件時該基本空間被刪除。
對比,有一個區(qū)別是可見的。腳本相當于一個寫在文件中的命令行語句。
函數(shù)與腳本的異同
- (1)從函數(shù)名必須與文件名相同。
- (2)腳本式M文件沒有輸入?yún)?shù)或輸出參數(shù),而函數(shù)式M文件有輸入?yún)?shù)和輸出參數(shù)。
- (3)函數(shù)可以有零個或多個輸入和輸出變量。函數(shù)nargin和nargout包含輸入和輸出變量的個數(shù)。在運行時,可以按少于M文件中規(guī)定的輸入和輸出變量的個數(shù)進行函數(shù)調用,但不能多于這個標稱值。
從運行上看,與腳本文件不同的是,函數(shù)文件被調用時,MATLAB會專門為它開辟一個臨時工作空間,稱為函數(shù)工作空間(Function workspace),用來存放中間變量,當執(zhí)行完函
數(shù)文件的最后一條命令或者遇到return時就結束該函數(shù)文件的運行,同時該臨時函數(shù)空間及其所有的中間變量將被清除。函數(shù)工作空間相對于基本空間是臨時的、獨立的,在 MATLAB運行期間,可以產生任意多個臨時函數(shù)空間。 - (4)在M文件中,包括腳本和函數(shù),到第一個非注釋行為止的注釋行是幫助文本,當需要幫助時,返回該文本,通常用來說明文件的功能和用法。
- (5)函數(shù)M文件中的所有變量除特殊聲明外都是局部變量,而腳本中的變量都是全局變量。
- (6)變量的命名可以包括字母、數(shù)字和下劃線,但必須是以字母開頭。并且在M文件設計中是區(qū)分大小寫的。變量的長度不能超過系統(tǒng)函數(shù)namelengthmax所規(guī)定的值。
- (7)假設在函數(shù)文件中發(fā)生對某腳本文件的調用,那么該腳本文件運行產生的所有變量都存放于此函數(shù)空間中,而不是存在基本工作空間中。
子函數(shù)與私有目錄
一個M文件可以包含一個以上的函數(shù),其中有一個主函數(shù),其他為子函數(shù)。這些子函數(shù)只能被同一文件中的函數(shù)(主函數(shù)或其他子函數(shù))調用,但是不能被其他文件的函數(shù)調用。在一個M文件中,主函數(shù)必須出現(xiàn)在最上方,其后可接上任意數(shù)目的子函數(shù),而且子函數(shù)的次序可隨意。同一文件的主函數(shù)、子函數(shù)的工作空間都是彼此獨立的,各函數(shù)間的信息可通過輸入輸出宗量、全局變量或跨空間指令傳遞。
此外,可以在某一目錄中建立一個自己命名的私有目錄來存放相關的函數(shù),例如在work目錄下建立一個Iscode且錄,則work中的M文件(無論是腳本還是函數(shù))即可調用rscode下的任何函數(shù),而不必再定義其他搜尋路徑。在 rscode目錄下的函數(shù),只能被其父且錄的函數(shù)所調用而不能被其他目錄下的函數(shù)調用。
當M文件中需要調用某一個函數(shù)時,MATLAB是按照以下順序來搜尋的:
- 檢查此函數(shù)是否是子函數(shù);
- 檢查此函數(shù)是否為私有目錄的函數(shù);
- 從所設定的搜尋路徑搜索此函數(shù)
搜索過程中,只要找到與第一個文件名相符的函數(shù)就會立即取用而停止搜索。
特殊的控制語句
echo 指令— 用來控制m文件在執(zhí)行過程中是否
顯示
echo on — 打開所有命令文件的顯示方式
echo off — 關閉所有命令文件的顯示方式
echo — 在以上兩者間切換
echo對于命令文件函數(shù)文件有所不同,命令文件用法簡單,函數(shù)對所有命令起作用;函數(shù)文件用法較復雜,具體請help查詢。
echo file on — 打開file函數(shù)文件的顯示方式
echo file off — 關閉file函數(shù)文件的顯示方式
echo file — 切換file函數(shù)文件的顯示方式
echo on all — 打開所有函數(shù)文件的顯示方式
echo off all —關閉所有函數(shù)文件的顯示方式
用來提示出錯信息并終止當前函數(shù)運行,和warning與其差不多,不過其會繼續(xù)運行后面的語句。
5.pause: 此命令用于暫時中止程序的運行,等待用戶按任意鍵繼續(xù)進行。該命令在程序的調試過程和用戶需要查詢中間結果時使用很方便。該命令的語法格式如下:
pause %停止,按任意鍵開始 pause(n) %停止n秒,后繼續(xù) pause on %允許后續(xù)的pause命令終止程序的運行 pause off %禁止后續(xù)的pause命令終止程序的運行上一篇:
MATLAB學習筆記(一)
總結
以上是生活随笔為你收集整理的MATLAB学习笔记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数相乘(c语言/c++)
- 下一篇: 不是内部或外部命令,也不是可运行的程序