查看: 133394|回復: 301|關注: 11
打印 上一主題 下一主題

奇迹觉醒平民攻略: [技術文章] MATLAB最基礎教程

  [復制鏈接]

論壇優秀回答者

專家

2880 麥片

財富積分


奇迹觉醒女神之光 www.mhotr.icu 20003000


4

主題

5272

帖子

616

最佳答案
  • 關注者: 1064
跳轉到指定樓層
1#
發表于 2018-4-22 20:29:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
MATLAB最基礎教程(零):基本數學概念


    前言:matlab只是個軟件,用來完成機械的計算,而如何安排這些計算,需要用戶掌握最基本的數學概念。這篇將介紹工程數學中常用的數學概念,與matlab似乎并不相關,但實則是matlab的基礎。

1.數值與符號
    如果給工程數學問題分類,最大的兩類肯定是數值問題和符號問題,對應matlab的數值運算和符號運算。簡而言之,數值運算就是所有的變量的值已知,求解的也是一些具體的值;符號運算則剛好相反,不要求所有的變量都已知,求解的結果也不是變量具體的值,而是變量之間的關系。一個簡單的例子是
①數值問題:求解一元二次方程,ax2+bx+c=0,其中a=b=c=1,所求得的結果一定是x=幾點幾+幾點幾i,是個復數,是個具體的數值。
②符號問題:求解一元二次方程,ax2+bx+c=0,所求的的結果一定是x=求根公式,是abc的函數,是個關系
    可見,一個問題是數值問題還是符號問題,很大程度上決定于結果需要求解的是數值還是關系。當然兩個問題也可以相互轉化,比如數值問題的一元二次方程,我們一般會先轉化成符號問題,把abc代入求根公式,求出來變量x的具體數值。但實際中,一般我們并不推薦這樣做,原因是matlab的數值和符號是完全不同的兩套系統,相互轉化不僅需要多余的數值符號轉換語言,更可能帶來查錯的不便。
2.典型數值問題
    以下是常見的數值問題,文中提到的解法均可在數值計算、科學計算、數值算法這類書中找到。
2.1代數方程
    代數方程又分為線性方程和非線性方程,線性方程一般可以轉化為矩陣形式AX=b,對A求逆即可。求逆的數值解法一般有高斯賽德爾迭代,超松弛迭代等。非線性方程一般轉化為f(x)=zeros其中x是個向量,右側的zeros表示f是個多輸出函數,數值解法一般是迭代,常見的有牛頓迭代,最速梯度,點斜式等。
2.2常微分方程
    常微分方程一般轉化為Dy=f(y,t),且y(0)=y0是初始條件,其中y和Dy都是向量,f也是個多輸出函數,數值解法有歐拉法,龍格庫塔法。
2.3偏微分方程
    偏微分方程比較復雜,matlab處理偏微分方程也不專業,我也幾乎不用matlab處理這類問題。但工程數學上,偏微分方程的解法有兩類,差分法和有限元法。差分法需要采用中心差分,迎風差分等。有限元需要計算剛度矩陣等。
2.4插值和擬合
    插值和擬合是完全不同的兩個數學概念,雖然很多時候很多人都混淆了。兩者的描述都可以歸結為:已知函數上的點(x1,y1),(x2,y2)...(xn,yn),求一個已知的x,對應的y的數值。插值常用的多項式插值,三次樣條插值。擬合的本質是一個最優化問題,其中最常用的一種擬合是線性擬合,求解方法是最小二乘法。
2.5離散周期傅里葉變換
    嚴格說來,這并不能算一個數學問題,只是一種運算方式,就好像加減乘除一樣。特殊性在于這種變換是對于一個向量進行,且運算后的結果依然是個向量。這里提出來是為了強調這種傅里葉變換的限定,要求是離散周期,這也是數值方法能處理的唯一一種傅里葉變換。
2.6最優化問題
    最優化問題比較寬泛,一般可以歸結為求目標函數f(x)的最大或者最小值,其中f是一個單輸出的函數,x是一個向量。其中x需要滿足線性約束條件、非線性約束條件、上下界。具體的解法有最速梯度,遺傳,蟻群,退火等算法。
2.7數值積分
    已知函數上的點(x1,y1),(x2,y2),...(xn,yn),求函數在x1到xn的定積分。常見算法有矩形公式,梯形公式,辛普森公式。類似的問題還有數值求導。
3.典型符號問題
    以下是常見的符號問題,需要特別指出的是,無解問題。數值問題中也有一部分無解問題,但大多數工程中是碰不到的。而符號問題恰好相反,絕大部分我們遇到的符號問題都是沒有解的,或者準確的說,沒有解析解。比如求一元五次方程,我們知道x和這些系數存在關系,但無法寫出顯式的表達式,也就是說沒有解析解。
3.1遞推轉通項
    這個問題可以歸結為:已知xn+1=f(xn),求xn,常見于數列的推導。
3.2代數方程
    區別于數值問題中的代數方程, 這里的代數方程問題可以描述為:f(x,c)=0,求x=x(c),這里需要求解的其實是x和c的關系。
3.3常微分方程
    區別于數值問題中的常微分數方程, 這里的代數方程問題可以描述為:Dy=f(y,t,c),求y=x(t,c),一般無需初值條件。
3.4符號積分
    區別于數值問題中的數值積分,這里的符號積分可以描述為:已知函數關系y=f(x),求y的不定積分。同樣的問題還有符號求導。


論壇優秀回答者

專家

2880 麥片

財富積分


20003000


4

主題

5272

帖子

616

最佳答案
  • 關注者: 1064
2#
 樓主| 發表于 2018-4-22 20:38:24 | 只看該作者
本帖最后由 halleyhit 于 2018-4-22 21:04 編輯

matlab最基礎教程(一):軟件基本概念

前言:①如果你是第一次使用matlab,建議閱讀本教程。②以2017a版本為基礎,適用于2014a及之后的版本,之前的版本未測試。③結合這兩個月在壇子里回答的問題,整理成教程,水平有限,歡迎指正。

1.matlab的界面

    左上角,home標簽下,找到layout進行設置/復位,可以設置各板塊的顯示與隱藏。其中有幾個部分,請務必要顯示
①Current Folder:中文一般翻譯成工作路徑,一般設置成一個自己建立的、有讀寫權限的文件夾,例如我的文檔下建立一個matlab文件夾
②Command Window:字面意思是命令窗口,用來運行代碼,所有的代碼都是在這里輸入
③Workspace:字面意思是工作空間,其實就是暫存所有運行結果的地方,“暫”的具體含義是:關閉matlab后丟失
2.軟件中的基本概念
2.1 函數
    matlab之所以強大,就是因為提供大量的函數,你也可以建立自定義函數,方法是:Home->New->function。自定義函數一般保存在工作路徑下。函數文件的特征是:擴展名m,內容的第一行以function開頭,后續內容是“輸出變量=函數名(輸入變量)”。且函數名和文件名相同。
    每個函數在Command Window中運行,用來完成特定的計算任務,運行方式是輸入“輸出變量=函數名(輸入變量)”,然后按回車。例如有個系統自帶的函數是用來求絕對值的,函數名abs,所以在Command Window里輸入“a=abs(-1)”,就會顯示運算結果為“a=1”。且運算結果會在Workspace里出現一個變量a,雙擊后可看到a的值是1。
2.2 腳本
    可以理解為特殊的函數,這種函數內容的開頭沒有function那行,因此沒有輸入、輸出變量,也沒有函數名。文件擴展名和函數一樣是m,也需要在Command Window里運行。腳本都是用戶建立的,方法是:Home->New Script。一般保存在工作路徑下。腳本的功能就是完成用戶需要的、復雜的計算任務,通常腳本里會調用很多函數。
2.3 GUI
    一般翻譯為界面,就是人機交互界面的意思。寫腳本處理問題的方法有點麻煩,讓人看起來更像是碼農,所以現在很多問題可以通過界面點點鼠標解決。這時候就需要打開界面,打開方法是:在APPS標簽里可以找到所有已安裝的GUI工具,單擊即可。注意右邊有個小三角可以點開。和函數一樣,用戶也可以自己建立自定義GUI,這部分較為復雜,對新手而言有點遙遠。
2.4 toolbox
    一般翻譯成工具箱,matlab將功能相近或者應用上自成體系的一組函數和GUI打包成一個toolbox。正版的matlab在購買時,幾乎每一個toolbox都是要單獨收費的,所以toolbox也可以理解為matlab產品的???,一個工具箱就是一個產品/商品。
2.5 simulink
    一般用matlab解決問題的過程是:用戶自定義腳本,在Command Window里運行腳本。而腳本的運行邏輯是順序執行,和一般的編程一樣。simulink則提供另一種思路,圖形化編程,有點像labview,這種方法很適合于物理模型的仿真,因此有時用“matlab編程”和“simulink仿真”強調。使用方法是在home標簽下點擊simulink。
3.獲得幫助
    常用的獲得幫助有四種方法
①home標簽里,有個Help標志,點開后可以獲得各工具箱/產品的完整幫助文檔。新版本中默認使用在線,改用本地幫助的辦法是在home標簽里,Preferences下的matlab/Help里選擇installed locally
②cn.mathworks.com官網上找到支持,然后可以獲得教程。這種方法獲得的幫助文檔和第一種方法一樣。
③在Command Window里輸入 doc+函數名 來獲得幫助。比如輸入"doc fft"可以獲得離散傅里葉變換函數fft的幫助和范例。這種方法獲得的文檔是前兩種方法文檔中的部分。當然,前提是你要知道函數名,才能找到幫助。這種方法適合于獲得系統自帶函數的使用說明。
④使用GUI時,通常界面的角落里有Help,點開可以獲得幫助。這種方法獲得的文檔是第一和第二種方法文檔中的部分。這種方法適合于獲得系統自帶GUI的使用說明。
    這幾種方法中,最常用的是第三種,只要知道自己需要的函數名,就可以用這種方式獲得說明和范例。而實際使用中,一般常用的系統自帶函數,也并不是非常多,大概幾十個?真正需要牢記使用方法的可能就幾個,通常都是知道函數名,要用的時候doc一下。


論壇優秀回答者

專家

2880 麥片

財富積分


20003000


4

主題

5272

帖子

616

最佳答案
  • 關注者: 1064
3#
 樓主| 發表于 2018-4-22 20:38:35 | 只看該作者
本帖最后由 halleyhit 于 2018-4-22 21:32 編輯

matlab最基礎教程(二):變量類型與賦值

前言:matlab解決問題的最基本思路是建立腳本文件,那么腳本文件的第一段就是定義一些變量,這和C語言等編程思想是一樣的。matlab提供的變量類型很多,最基礎的是三種:數值變量、符號變量、字符串,其他的類型還有cell、table等。這里僅說明最基礎的變量類型。

1.數值變量
    matlab中所有的數值變量都是矩陣,賦值時,以方括號作為開頭和結尾,以英文逗號或空格分割同行元素,以英文分號分割各列。例如在Command Window里輸入
  1. a=[1 2;3 4]
復制代碼
可以看到運算結果,a是一個數值變量。同時workspace里出現一個田字形的變量a,說明變量a的類型是數值型。

    向量和數字可以視為特殊的矩陣,例如
  1. a=[1 2]
  2. a=[1;2]
復制代碼
分別是行向量和列向量,
  1. a=[1]
復制代碼
可以簡寫為
  1. a=1
復制代碼
是數字。

    數值變量的命名要求是英文字母開頭,不能包含特殊符號,大小寫敏感。這里推薦采用下劃線來進行分割,例如value_of_A,這和其他編程語言的命名規則大體相當。
    賦值中,有時需要用到等差數列,例如定義一個向量a=[1 2 3],如果比較長,賦值很麻煩,所以matlab提供了一個簡單的方法
  1. a=[1:1:3]
復制代碼
這里兩個冒號的意思是起始值:步長:終值。采用這種賦值方式時可以獲得一個等差數列行向量,并可以省略兩側的方括號。當步長為1時,可以省略步長和一個冒號,于是可以簡寫為
  1. a=1:3
復制代碼
    另一種靈活的賦值方法是分塊矩陣,其方法是變量名后面加圓括號,圓括號中加序號。例如
  1. a=[1 2;3 4]
復制代碼
定義變量a之后,
  1. b=a(1,2)
復制代碼
就可以把a的第一行第二列元素賦值給b,當然也可以用
  1. a(1,2)=1
復制代碼
來修改矩陣中部分元素的值。這里需要注意,序號必須是自然數,且不能是零。當矩陣中有多個元素需要賦值時,可以將序號部分改成向量,例如
  1. a([1 2],[1 2])=[1 2;3 4]
復制代碼
中把行數和列數都用向量表示,就是說對矩陣a的第1和2行,第1和2列,總共4個元素賦值。更進一步,也可以有a([1 2],1)表示a的第一列,也可以寫成
  1. a(1:end,1)
復制代碼
這里的end表示終點,即a的行數2,也可以更進一步簡寫成
  1. a(:,1)
復制代碼
這里的冒號表示從頭至尾。這類賦值方法最為常用,但基本的語法非常簡單,方括號表示矩陣開頭和結尾,圓括號表示從矩陣中選取部分,把握這個原則,有利于讀懂程序。
    當然分塊矩陣也可以
  1. b=[a a]
復制代碼
這樣的賦值方法,但需要注意的是,方括號中的元素必須滿足矩陣的行列數要求,例如
  1. a=[1 1]
  2. b=[1;1]
  3. c=[a b]
復制代碼
就會引起錯誤,因為此時matlab無法確定c的行列數。
2.符號變量
    總體而言,符號變量比數值變量簡單得多,因為變化非常少,常用的賦值命令是
  1. syms a b
復制代碼
這里syms表示這里要定義一些符號變量,a和b是變量名,符號變量的命名規則和數值變量一樣。有時候也采用
  1. syms a real
復制代碼
來強調a是實數變量,具體可以doc syms來獲得幫助。
    有些變量之間存在依賴關系,此時可以定義
  1. syms x y(x)
復制代碼
這里聲明x是一個符號變量,又聲明y是一個符號變量,且y的值由x決定,這相當于數學中函數的概念。當然具體的函數關系并沒有明確規定。也可以
  1. syms x y z(x,y)
復制代碼
來定義符號變量z,z依賴x和y。這相當于二元函數的概念。這里的圓括號顯然和數值變量中的圓括號含義完全不同,這也是學習matlab最不習慣的地方,同一個符號,由于變量類型不同會有完全不同的含義。所以在學習matlab的過程中,一定要區分數值變量和符號變量。
    上述方法定義的符號變量是一個數,或者1*1矩陣,matlab中也可以定義符號矩陣,例如
  1. syms a11 a12 a21 a22
  2. A=[a11 a12;a21 a22]
復制代碼
就可以獲得一個矩陣符號變量A。
    定義符號變量后,workspace中出現相應的變量名,圖形不是數值變量的田字形,而是方框里有個立方體,雙擊后可以看到行列數。


3.字符串
    比數值、符號更為簡單的就是字符串了,其定義方法是以單引號開頭和結尾,例如
  1. a='hello world'
復制代碼
就定義了一個字符串a,其值為你好世界。matlab中較為特殊的是,字符串可視為行向量,例如
  1. b='hello '
  2. c='world'
  3. a=[b c]
復制代碼
也可以獲得字符串a,其值為你好世界。另外,有時也可以將字符串視為矩陣,例如
  1. a=['ab';'cd']
復制代碼
但這種用法很罕見,同時要求各行字符串長度一樣,否則將違反矩陣行列數規定。
    當然字符串的值也可以是特殊符號,比如
  1. ','
復制代碼
就定義了逗號,而最特殊的就是定義單引號,因為單引號會和字符串定義中的單引號混淆,因此matlab中用兩個單引號表示一個單引號,也就是
  1. a=''''
復制代碼
表示a是一個字符變量,值是一個單引號。語句中第一和第四個單引號是字符串類型的開頭和結尾,中間兩個單引號用來表示一個單引號。
    定義字符串變量后,workspace中出現相應的變量名,圖像是方框里寫了ch,雙擊后可以看到行列數。

論壇優秀回答者

專家

2880 麥片

財富積分


20003000


4

主題

5272

帖子

616

最佳答案
  • 關注者: 1064
4#
 樓主| 發表于 2018-4-22 20:38:54 | 只看該作者
本帖最后由 halleyhit 于 2018-4-26 14:12 編輯

matlab最基礎教程(三):常用的系統自帶函數,數值變量篇

前言:上一篇說了變量的類型和賦值,這里接著說這些變量的基本運算,捎帶一些常用的系統自帶的函數,通過這些運算和函數,已經可以完成一些簡單的計算了。

1.數值變量的基本運算
    數值變量都是矩陣,矩陣之間最基本的運算有加、減、乘(方)、轉置,運算符分別是+-*',與數學中的一般表示無異,但仍有一些地方需要注意,以下結合代碼進行說明。
1)矩陣加減法只有維度相同的矩陣才能進行,例如
  1. a=[1 2]
  2. b=[1 3]
  3. c=[1;2]
復制代碼

  1. d=a+b
  2. d=a-b
復制代碼
都是可以進行的,因為a和b都是1行2列,但
  1. d=a+c
復制代碼
則無法進行,因為數學上,不同維度的矩陣加減法并沒有定義。
2)矩陣乘法只有第一個矩陣的列數等于第二個矩陣的行數時,才能進行,例如上段代碼中的abc,則
  1. d=a*c
復制代碼
是可以進行的,但
  1. d=a*b
復制代碼
則不能進行,原因同樣是因為這種計算在數學上沒有定義?;褂幸恢痔厥獾某朔?,也就是乘方,例如
  1. A=[1 2;3 4]
  2. B=A*A
復制代碼
這樣的矩陣乘法可以寫成
  1. B=A^2
復制代碼
當然,數學上規定,只有方陣才能進行乘方。
3)矩陣與數乘除,由于數也可以看做1*1的矩陣,因此這是一種特殊的矩陣乘除法,和數學上定義一樣,比如
  1. d=a*2
  2. d=a/2
復制代碼
這些都能進行。
4)轉置,任何維度的矩陣都可以進行轉置,例如
  1. d=a'
復制代碼
就會將a這個行向量轉置,得到一個列向量d。需要注意的是,這種運算更準確的說法是共軛,對實數矩陣而言,這兩種說法并沒有什么區別,但對復數矩陣而言,共軛的意思,不僅是把a(i,j)和a(j,i)交換位置,更要把所有元素的虛數部分乘以-1。
2.數值變量的特殊運算
    和其他軟件不同,matlab里提供了一些很有意思的運算符,有點乘.*、點除./和點方.^,這些運算符在本身的運算符前加一個點,可以實現很強大的功能,但由于和一般的運算符太像,也造成了很多人混淆。這些運算符有很多叫法,比如.*,一般稱為點乘、元素乘、數乘,這些叫法都是為了讓這個運算符區別于普通的乘,有時為了強調這種區別,也把通常的乘叫矩陣乘。
    簡單而言,這些運算的含義是將矩陣作為一般的數來進行運算,比如
  1. [1 2 3].*[4 5 6]
  2. [1*4  2*5  3*6]
  3. [1 2 3]./[4 5 6]
  4. [1/4  2/5  3/6]
  5. [1 2 3].^3
  6. [1^3  2^3  3^3]
復制代碼
所以這里點乘和點除需要注意,只有同樣維度的矩陣才能進行這種特殊運算。另外點除還要注意不要除以零,雖然matlab并不會報錯,但除以零在數學上沒有定義,所以這種除法其實已經失去了意義。
    于是,什么時候用矩陣乘,什么時候用點乘,其實是看計算的目的,但有些時候,這兩種運算符的確是等效的:
1)數字的乘除
  1. 1*1
  2. 1.*1
復制代碼
當然結果相同
2)矩陣與數字的乘除
  1. 1*a
  2. 1.*a
復制代碼
結果也是一樣的
3.數值變量的常用函數
    這里的函數都可以通過doc+函數名查到更詳細的幫助,因此僅列出典型用法。
  1. a=ones(3)
  2. a=ones(1,5)
復制代碼
生成指定大小的全1矩陣
  1. a=zeros(3)
  2. a=zeros(1,5)
復制代碼
生成指定大小的全0矩陣
  1. a=eye(3)
復制代碼
生成指定大小的單位方陣
  1. inv([1 2;3 4])
復制代碼
矩陣求逆,只能對方陣操作。matlab有左除法,通常更高效,如有需要也可嘗試
  1. size([1 2;3 4])
復制代碼
獲得矩陣的行數和列數,也可以通過
  1. size([1 2;3 4],1)
復制代碼
單獨獲得行數或者列數
  1. length([1 2 3])
復制代碼
獲得向量的長度,這個命令也可以對矩陣操作,當然一般只對向量操作
  1. max([1 2 3])
  2. min([1 2 3])
復制代碼
獲得向量的最大和最小值,也可以對矩陣操作
  1. sort([2 1 3])
復制代碼
按大小對向量進行排序,也可以對矩陣操作
  1. sum([1 2 3])
復制代碼
求和,也可以對矩陣操作
  1. cumsum([1 2 3])
復制代碼
累積求和,類似求定積分,一般只對向量操作,需要注意的是,累積求和后,結果和原向量長度一樣
  1. diff([1 2 5 6])
復制代碼
差分運算,類似于求導,一般只對向量操作,需要注意的是,差分操作后,結果的長度比原向量少一
  1. plot([1 2.5 3],[5 6 4])
復制代碼
畫圖,需要注意的是,兩個向量的長度要相等才能畫圖
  1. exp([1 2])
復制代碼
指數函數,類似的數學函數還有三角函數(sin,cos,tan,asin,acos,atan),對數函數(log),這些函數在對矩陣操作時,相當于對矩陣中的每個元素進行操作,類似點乘這樣的運算符。


論壇優秀回答者

專家

2880 麥片

財富積分


20003000


4

主題

5272

帖子

616

最佳答案
  • 關注者: 1064
5#
 樓主| 發表于 2018-4-22 20:39:08 | 只看該作者
本帖最后由 halleyhit 于 2018-4-26 14:13 編輯

matlab最基礎教程(四):常用的系統自帶函數,符號變量與字符串篇

前言:matlab字面意思是矩陣實驗室,軟件重點是數值變量的運算。所以在符號變量和字符串的運算上,功能并不強大,我用的也不是很多,因此這篇的內容請多多指正。

1.符號變量的基本運算
    符號變量的基本運算與數值變量一樣,加減乘之類的,比如
  1. syms x y(x)
  2. g=x*y
復制代碼
并沒有需要特別說明的。

2.符號變量的特殊運算
    符號變量的特殊運算也與數值變量一樣,但一般而言,符號變量都是1*1矩陣,因此特殊運算與基本運算一般都是等效的。比如
  1. g=x*y
  2. g=x.*y
復制代碼
的運算結果完全一樣。

3.符號變量的常用函數
    數值變量的常用函數,一般都可以直接用在符號變量上,比如三角函數
  1. syms x
  2. y=sin(x)
  3. a=1
  4. b=sin(a)
復制代碼
這些都是可以通用的,而且函數的含義也完全一樣。
    但偏偏有些函數非常蛋疼,對符號變量與數值變量都可以進行操作,但操作的含義完全不同,比如diff,diff對于一個數值變量的運算結果是差分,而對于一個符號變量的運算結果則是求導
  1. syms x
  2. f=diff(sin(x))
  3. a=[1 2 3]
  4. b=diff(a)
復制代碼
運算出來的f是sin(x)的導數,也就是cos(x),依然是個符號變量,而b運算結果則是一個差分向量。
    另外也存在很多函數只能對數值變量操作,比如離散傅里葉變換fft?;褂瀉芏嗪荒芏苑瘧淞坎僮?,比如泰勒展開taylor。因此在matlab使用中,一定要區分變量的類型,其實真的用起來也好區分,因為完成特定的計算任務,要么全部用數值,要么全部用符號,這也符合一般處理問題的原則。
    我平時做符號運算比較少,用到的函數,除了exp、sin這類數學運算外,還有:
int 求積分,符號運算特有,可以求定積分,也可以求不定積分,但一般不會寫+C
diff 求導數,符號運算特有
limit 求極限,符號運算特有
ezplot 作圖(新版本中,軟件推薦使用fplot),類似數值變量運算時的plot

4.字符串的常用函數
    matlab中字符串的常用算符就更少了,但都非常有用,這里介紹幾個:
1)num2str和str2num:可以實現數值變量和字符串變量的轉換,比如
  1. a=1
  2. b=num2str(1)
復制代碼
運算結果顯示a是一個數值變量,b是一個字符串變量,函數名中的2就是英文中to的意思,也就是把num數值類型轉化成str字符類型。str2num就是這個函數的反函數,這兩個命令結合,可以實現特定的功能,比如提取一個數字的最高位:
  1. a=123456
  2. b=num2str(a)
  3. c=b(1)
  4. d=str2num(c)
復制代碼
2)eval:其原理是把“字符串”變成“命令”并執行。但使用過程中需要注意的是,這個命令不可以“編譯”,也就是只能在matlab內使用,無法移植到C,JAVA等其他語言平臺。有需要的可以自行嘗試這個命令。

論壇優秀回答者

專家

2880 麥片

財富積分


20003000


4

主題

5272

帖子

616

最佳答案
  • 關注者: 1064
6#
 樓主| 發表于 2018-4-22 20:39:23 | 只看該作者
本帖最后由 halleyhit 于 2018-4-23 07:12 編輯

matlab最基礎教程(五):判斷與流程控制

前言:判斷常用于數學中的分段問題,更為復雜的問題則需要流程控制。本篇介紹matlab中的相關語法,這些語法并不難,但卻很容易混淆,一方面是和其他語言,例如C語言混淆;另一方面是和matlab自身的其他語句,例如賦值混淆。


1.邏輯變量
1.1邏輯變量的賦值
    有些語言中,邏輯變量是一種專門的變量類型,其值為true或者false,matlab中也有這個類型,但其值為1或者0。賦值方式是“變量名=表達式”,變量名的命名規則與數值變量一樣,表達式是一種判斷,比如數值大小的判斷,或者高級函數的判斷。例如輸入
  1. a=1>2
復制代碼
就定義一個邏輯變量a,其值是0,表示false,在workspace里可以看見a的類型是logical。

    對初學者,可以認為數值大小的判斷,是指兩個1*1維的數值變量的比較。數值大小比較的方法有:>大于;<小于;>=大于等于;<=小于等于;==等于;~=不等于6種。因為數值計算有舍入誤差,所以等于這個判斷,有時需要用
  1. abs(x1-x2)<eps
復制代碼
這樣的不等式來代替,其中eps是matlab中最小的非零數值,相當于舍入誤差的標準。
    高級函數的判斷,是指系統自帶的一些函數,例如
  1. a=isprime(x)
復制代碼
用來判斷x是否為質數,
  1. a=exist(x)
復制代碼
用來判斷是否存在變量、函數或者文件。

1.2邏輯變量的邏輯運算
邏輯變量的取值只有0或者1,他們之間可以進行邏輯運算,運算符有:&&與;||或;~非。這里需要注意:
1)~單獨使用表示非運算,要區別于不等于~=的連用
2)如果是高級函數的判斷配合非運算,也可以實現判斷,例如
  1. a=~isprime(x)
復制代碼
就相當于判斷x是否為合數

1.3邏輯變量的數值運算
    matlab中邏輯變量可以參與數值運算,參與時,會被數值0和1代替。例如
  1. a=1>2
復制代碼
生成一個邏輯變量a,則
  1. b=a+1
復制代碼
時,matlab會判斷正在進行數值運算,然后將邏輯變量a轉化成數值變量,由于a在邏輯變量時表示false,所以轉化時,a相當于數值變量0,因此會得到數值變量b=0+1=1。

2.流程控制
    matlab的流程控制和C語言類似,if和switch作為判斷依據,相當于流程圖的菱形框,for和while作為循環,相當于流程圖的反向箭頭。
2.1if判斷
    語法是:
  1. if 邏輯變量1
  2.     執行語句1
  3. elseif 邏輯變量2
  4.     執行語句2
  5. else
  6.     執行語句3
  7. end
復制代碼
其含義與C語言中一致,是順序判斷,即逐個if或者elseif進行判斷,若邏輯變量為1,則執行語句,若為0則進行下一個判斷。其中邏輯變量經常用多個邏輯變量的邏輯運算結果來代替,例如我們經??吹降氖?/font>
  1. if x>1 && y>1
復制代碼
而不是先賦值再判斷的
  1. a=(x>1) && (y>1)
  2. if a
復制代碼
其實這兩種方法是等效的。有時候為了書寫和注釋,也會先定義一個邏輯變量flag,然后再if flag。

2.2switch判斷
    switch的語法是:
  1. switch 數值變量1
  2. case 數值1
  3.     執行語句1
  4. case 數值2
  5.     執行語句2
  6. otherwise
  7.     執行語句3
  8. end
復制代碼
switch與if最大的不同是,switch只進行一次判斷,即根據數值變量1的值來決定執行哪一個case,而不像if會判斷多個elseif。需要強調的是,只有當數值變量1==數值1時,才會執行語句1,而之前說過,==這個判斷是有舍入誤差的,因此switch一般用于數值變量1只取整數時,比如sfun的判斷。對初學者而言,也可以先無視switch。

2.3for循環
    for循環的語法是:
  1. for 數值變量=向量
  2.     執行語句
  3. end
復制代碼
其含義是,數值變量會取向量中的每一個值,然后執行語句,在執行語句中,數值變量是一個1*1的矩陣。比如
  1. for a=[0 1 3]
復制代碼
則會讓a=0,執行語句,然后a=1,執行語句,最后a=3,執行語句。這里容易和賦值語句混淆,因為a=[0 1 3]是一個數值變量賦值,賦值后a是個向量,但加上了for后,a是1*1矩陣。另外,在數值變量賦值那段,我們說過有一種常用的賦值方法是"a=初始值:步長:終值",其結果是把a賦值成一個向量,因此這也廣泛用于for語句中
  1. for a=初始值:步長:終值
復制代碼
則在執行語句中,a是一個遍歷初值到終值的1*1矩陣。

2.4while循環
    while語句的語法是:
  1. while 邏輯變量
  2.     執行語句
  3. end
復制代碼
其含義是,當邏輯變量為1時,執行語句,直到邏輯變量為0,因此while的執行語句中,一定有改變邏輯變量的部分,否則就是死循環。比如寫了while a<10,就一定會在執行語句中有類似a=a+1這樣的賦值語句,使得若干次循環后,邏輯變量為0。總體而言,while并不如for穩定,所以初學者也可以無視while。

論壇優秀回答者

專家

2880 麥片

財富積分


20003000


4

主題

5272

帖子

616

最佳答案
  • 關注者: 1064
7#
 樓主| 發表于 2018-4-22 20:39:35 | 只看該作者
本帖最后由 halleyhit 于 2018-4-23 07:17 編輯

matlab最基礎教程(六):編程習慣

前言:matlab的基本使用方法差不多介紹完了,確定問題類型(數值/符號),編程(函數/腳本)并運行即可。但具體編程過程中,良好的習慣非常重要,一方面便于調試,另一方面便于代碼維護和升級。


1.注釋
    matlab提供兩種注釋,分別是%%和%。%%一般獨占一行,用來分段,兩個%%之間的內容稱為一段,在程序調試時,可以設置為運行一段代碼后暫停,以便查看一段代碼的運行結果。使用范例如下:
  1. %%賦值
  2. 賦值代碼
  3. %%第一階段計算
  4. 第一階段代碼
  5. %%第二階段計算
  6. 第二階段代碼
  7. %%輸出
  8. 輸出階段代碼
復制代碼
這樣在調試時,若設置分段運行,則運行完賦值代碼后,程序自動進入調試模式,此時可以在workspace里看到賦值段的運行結果,以便確認這段代碼是否正確。
    %常用于一般代碼的末尾,用來說明這一行代碼的含義,例如
  1. g=9.8%重力加速度賦值
復制代碼
這樣之后調試時,可以快速找到這一行,并修改相應代碼。需要注意的是,%僅在行內,對其后的內容有效,遇到回車換行后失效。此外,無論是%%還是%,注釋內容會顯示為綠色。

2.分行
    無論matlab還是其他程序語言,也無論函數還是腳本,依次逐行運行是基本特征,因此我們一般不希望一行的內容太多,因為這樣不方便差錯。但如果一定要使用這樣一行很長的代碼,matlab提供了一種分行的方式。使用方法是在代碼中輸入三個.,然后回車。這樣產生的代碼比如:
  1. a=...
  2. 1
復制代碼
這行代碼和a=1完全一樣。需要指出的是,這種分行方式僅在輸入時有效,在實際運行中,matlab仍然認為這是一行代碼。這種分行的另一種用法是用在矩陣賦值中,比如
  1. a=[1 2;...
  2.    3 4]
復制代碼
這樣可以很明顯看出a是2*2矩陣。

3.分號
    matlab的每一行代碼,一般都會在command window里顯示運行結果,如果不想顯示,可以在代碼后面寫一個分號;,這樣就可以不顯示該行的運行結果。需要注意的是:其一,寫不寫分號不影響程序的運行和結果;其二,顯示運行結果是需要占用計算時間的,因此一般的語句都會寫上分號;其三,if、for等流程控制語句,這一行不加分號。

4.先定義再使用
    雖然matlab中可以直接使用a(2,2)=1這樣的語句,而無需先定義a是多大維度的矩陣,但這樣可能造成運行變慢。先定義再使用依然是個好習慣,尤其是賦值語句中有講過zeros和ones這樣的語句,先把矩陣的維度定義好,再逐個元素賦值或者局部賦值,有助提高運行效率。

5.特殊運算代替循環
    matlab相較于C等語言的強大之處在于用特殊運算代替循環,比如a和b是同緯度矩陣,要將他們對應的元素相乘。在常用運算中,我們講過,在matlab中可以用點乘.*。在C語言中則需要一個for循環,遍歷a和b的每個元素,相乘后賦值給結果矩陣。當然,matlab中也可以用for循環來實現這個操作,但相比特殊運算,for循環的效率實在是差太多。特殊運算代替循環也成為了提高運行效率的主要方法,當然,如果是習慣于C語言的初學者也可以無視這一節。

論壇優秀回答者

專家

2880 麥片

財富積分


20003000


4

主題

5272

帖子

616

最佳答案
  • 關注者: 1064
8#
 樓主| 發表于 2018-4-22 20:39:47 | 只看該作者
本帖最后由 halleyhit 于 2018-4-23 07:22 編輯

matlab最基礎教程(七):編程調試與常見報錯

前言:剛寫完的腳本,運行時難免出錯,此時需要關注報錯信息與提示,進行調試。同時,這也是本教程最后一篇。

1.打斷點和分段
   寫完腳本并保存后,在每一行可執行代碼前,有一個行號,和一個小橫線。報錯信息中會有類似“Error in 文件名 (line 行號)”這樣的提示,其中的行號就是代碼前的這個行號。小橫線說明這一行是可執行代碼,而不是注釋。鼠標左鍵小橫線,此時橫線變為紅點,說明在這個位置設置了一個斷點。腳本運行時,遇到斷點會自動暫停,并進入調試模式。此時可以用continue繼續執行,也可以step逐行執行,也可以step in進入調用的子函數執行。初學者一般熟悉step即可。

    進入調試模式時,可以觀察workspace里的變量,看是否和預想一樣,也可以在command window里輸入其他代碼或運行其他腳本/函數。在調試模式中,可以通過左鍵斷點(紅點)和小橫線來設置新的斷點和取消舊的斷點。也可以按quit debugging退出調試模式。
    分段是類似斷點的一種運行方式,參考上一篇中%%注釋的說明。當腳本中有多個%%時,%%相當于分段符號,左鍵run and advance可以實現逐段運行,運行完一段后,相當于進入調試模式,可以在workspace里查看運行結果,但其他的操作一般不建議進行。分段運行的另一種用法,是需要輸出多個圖像的時候,可以運行一段,截圖,再運行一段,再截圖。

2.常見報錯
    運行腳本后,會在command window里出現紅色或者黃色的字,就是報錯信息與提示。首先,報錯信息會給出定位,哪個文件,第幾行。有時會在多個位置給出報錯,這說明報錯那行的調用關系,例如自定義腳本A中n行調用了自定義函數B,而自定義函數B的m行出錯了,則報錯信息會定位到A的n和B的m,看起來好像是兩個地方出錯,其實是B的m錯了,但實際中也可能是調用B的方式不對。這種情況尤其會出現在調用系統自帶函數時,此時一般是調用方式不對,所以要關注A的n。
    給出報錯定位后,就是看具體的報錯信息了,matlab中常見的一些報錯信息有:

Undefined function or variable '函數/變量名'.
說明使用變量前沒有遵循先定義再使用的原則

Inner matrix dimensions must agree.
數值運算中常見錯誤,參考數值基本運算那篇的矩陣運算部分

Index exceeds matrix dimensions.
超出索引,例如a=[1 2 3],此時當用到a(4)時
雖然定義了a1~3,但沒有定義a4,此時卻用到了a4,因此報錯
本質上,這也是一種未定義先使用的錯誤

Subscript indices must either be real positive integers or logicals.
參考矩陣賦值中所說的分塊賦值,圓括號中表示位置或者序號,當圓括號中出現非自然數時報錯

Expression or statement is incorrect--possibly unbalanced (, {, or [.
有開括號而沒有關括號,或者有關括號而沒有開括號,一般是計算式太長而打錯了

Invalid data type. 或者Data must be numeric.
或者Undefined function '函數名' for input arguments of type 'double'.
參考前述的數值運算與符號運算的說明,有些函數只用于數值,有些只用于符號,混用時報錯。

3.最后總結
1)doc+函數名,多看幫助多看范例??吹椒獨?,逐行運行看結果
2)分清數值和符號,兩種運算兩套系統
3)學好數學再學軟件(其實基本的數學知識在幫助文檔里也有)

論壇優秀回答者

專家

2880 麥片

財富積分


20003000


4

主題

5272

帖子

616

最佳答案
  • 關注者: 1064
9#
 樓主| 發表于 2018-4-22 20:40:39 | 只看該作者
完結,水平有限,歡迎指正

新手

23 麥片

財富積分


050


0

主題

25

帖子

0

最佳答案
  • 關注者: 3
10#
發表于 2018-4-23 10:17:38 | 只看該作者
非常好啊,基礎
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

關閉

站長推薦上一條 /4 下一條

快速回復 奇迹觉醒女神之光 返回列表