Matlab筆記
0. 目錄
文章目錄
1. Matlab 基礎語法
1.1 變數和語句
1.1.1 變數
- 變數命名與其他語言相同。
- 變數不宣告,不定義,拿來即用(類似Python)。
- 變數都儲存在變數空間中(Workspace)
語句
- 語句:回車代表結束,如果末尾加上分號
;
- 一行無法寫完那麼使用
...
來續行,否則預設語句完成。 - 註釋以
%
表示。
賦值
變數=表示式
- 前者以及複製給了某一個變數,後者將表示式的賦值給預設變數
ans
ans
為Matlab當中的保留字
變數管理
- 工作空間裡面
- 在控制檯中使用下面兩個命令來獲取
who
可以得到當前全部變數的名字whos
得到我們當前記憶體中的變數,型別,每個變數所分配的記憶體空間,以及它們是否是複數
- 清除當前工作空間的變數
- clear命令 現在假設我們要全部重新開始,要這樣做,我們輸入
clear
命令。要清除全部變數只需輸入clear
然後回車即可,要清除特定變數,則在clear
clear x y z
- clear命令 現在假設我們要全部重新開始,要這樣做,我們輸入
- 儲存資料的命令
- save命令:
save [檔名] [變數名] [-append] [-ascii]
- save命令將Matlab中選擇的變數儲存在.mat形式的二進位制檔案中
- [-append] 表示可以將某一個變數增加到某個檔案裡面
- [-ascii] 更改檔案格式
- save命令:
- 匯入資料
load [檔名]
常數變數
常數名稱 | 代號 |
---|---|
虛數 − 1 \sqrt{-1} −1 | i 或者 j |
圓周率 π \pi π | pi |
自然常數 e e e | eps |
最小正實數,約等於0(無窮小) | realmin |
最大正實數,大約為無窮大 | realmax |
無窮大 | Inf |
無意義的數 | NaN |
資料輸出
-
format函式:
format 格式符(比如long,short之類的)
format
預設格式
format shor
t 5字長定點數,顯示5位(scaled fixed point format with 5 digits)
format long
15字長定點數,顯示15位雙精度,7位單精度(scaled fixed point)
format short e
5字長浮點數
format long e
15字長浮點數
format hex
16進位制
format bank
定點貨幣形式
format rat
小數分數表示
format +
+,-,空格
format compact
壓縮空格
format loose
包括空格和空行
format short g
5位定點或浮點格式。
format long g
對雙精度,顯示15位定點或浮點格式,對單精度,顯示7位定點或浮點格式。獲取當前格式
獲取當前數值格式。
f = get(0,'Format') f = shortG
獲取當前行距,可以將其設為
loose
或compact
。S = get(0,'FormatSpacing') S = loose
輸出顯示格式,指定為下列選項之一。
這些樣式可控制數值變數的輸出顯示格式。
Style
結果 示例 short (default)
固定十進位制短格式,小數點後包含 4 位數。 3.1416
long
長固定小數格式, double
值的小數點後包含 15 位數,single
值的小數點後包含 7 位數。3.141592653589793
shortE
短科學記數法,小數點後包含 4 位數。 3.1416e+00
longE
長科學記數法, double
值的小數點後包含 15 位數,single
值的小數點後包含 7 位數。3.141592653589793e+00
shortG
短固定小數格式或科學記數法(取更緊湊的一個),總共 5 位。 3.1416
longG
長固定小數格式或科學記數法(取更緊湊的一個),對於 double
值,總共 15 位;對於single
值,總共 7 位。3.14159265358979
shortEng
短工程記數法,小數點後包含 4 位數,指數為 3 的倍數。 3.1416e+000
longEng
長工程記數法,包含 15 位有效位數,指數為 3 的倍數。 3.14159265358979e+000
+
正/負格式,對正、負和零元素分別顯示 +
、-
和空白字元。+
bank
貨幣格式,小數點後包含 2 位數。 3.14
hex
二進位制雙精度數字的十六進位制表示形式。 400921fb54442d18
rat
小整數的比率。 355/113
行距格式
Style
結果 示例 compact
隱藏過多的空白行以便在一個螢幕上顯示更多輸出。 theta = pi/2theta = 1.5708
loose
新增空白行以使輸出更易於閱讀。 theta = pi/2theta = 1.5708
資料型別
使用class(變數名)
檢查變數名的資料型別
-
數值型
-
雙精度(8位元組)
a = 1
-
單精度
-
無符號/有符號整型
雙精度的基礎上 b = uint8(a); a轉化為無符號8位整型
-
-
字串
-
使用單撇號(與Python類似)
-
doule(變數名)
獲取字串的ASCII碼值 -
char(int)
獲取字元 -
str2num:
str2num('1234')
的輸出結構為1234這個值 -
num2str同理
-
eval函式:eval(‘語句’)將語句裡面當成語句來使用,類似Python
-
-
結構體
- 建立:
結構體.成員名=表示式
- 操作
isstruct(a)
:是否是結構體fieldnames(a)
:返回結構體全部成員的名字,返回型別為字串陣列isfield(結構體名,“成員名”)
:返回某個成員是否是結構體的成員rmfield(結構體名,“成員名”)
:刪除某個成員getfield(結構體名,“成員名”)
:獲取某個成員
- 建立:
-
單元
- 建立:使用{}括號起來建立
a={1,'str',[11 22 33 44]};
- 單元類似Python裡面的元組
- 建立:使用{}括號起來建立
-
多維矩陣
-
稀疏矩陣
資料的運算
- 加
a + b
- 減
a - b
- 乘
a * b
- 除
a / b
- 乘冪
a ^ b
- 以e為底的指數
e
a
e^a
ea:
exp(a)
- a的平方根
a
\sqrt{a}
a
:
sqrt(a)
- a的自然對數
l
o
g
e
a
log_ea
logea:
log(a)
- 其他底的對數
l
o
g
10
a
log_{10}a
log10a:
log10(a)
- 三角函式:
cos(pi/4)
- 反三角函式,在三角函式前面加一個字元a:
atan(pi/3)
- 複數
i
=
−
1
i = \sqrt{-1}
i=−1
:
i=x+iy
或者i=x+yi
特殊操作指令
clc
:清除命令視窗的內容,對工作環境中的全部變數無任何影響close
:關閉當前的Figure視窗close all
:關閉所有的Figure視窗clear
:清除工作空間的所有變數clear all
:清除工作空間的所有變數,函式,和MEX檔案
2.Matlab 基礎數學操作
2.1 向量和矩陣
向量vector
- 行向量,使用分號 “;” 隔開
a = [1; 2; 3; 4]
- 列向量,使用空格或者逗號隔開
a = [1 2 3 4] 或 a = [1,2,3,4]
- 向量的數量乘:
b = c*a(其中c是一個數量)
- 向量的轉置:在向量後面加一個單引號(‘)比如
b = a'
- 向量的加和減,直接使用加號和減號使用:
A + B 和 A - B
- 向量的合併,直接將兩個向量使用分號或者逗號隔開:
列向量D = [A;B],行向量D = [A,B]
向量的操作
-
返回矩陣的長度,
length(向量)
>> a=[1,2,3,4,5]; >> length(a) ans = 5
-
返回向量裡面的最大元素和最小元素,
max(向量)和min(向量)
>> a=[1,2,3,4,5]; >> min(a) ans = 1 >> max(a) ans = 5
-
向量的數量積(點乘),使用陣列乘法(.*),即
向量 . * 向量
>> a=[1,2,3,4,5]; >> a.*a ans = 1 4 9 16 25
-
向量中全部元素的和,
sum(向量)
>> a=[1,2,3,4,5]; >> sum(a) ans = 15
-
計算向量的模,即 ∣ v ∣ = v 1 2 + v 2 2 + v 3 2 + . . . + v n 2 |v|=\sqrt{v_1^2+v_2^2+v_3^2+...+v_n^2} ∣v∣=v12+v22+v32+...+vn2
先使用點乘(.*)求得全部元素各自的平方,然後使用sum求和,最後sqrt取方根
>> a=[1,2,3,4,5]; >> sqrt(sum(a.*a)) ans = 7.4162
-
兩個向量的數量積(點乘),
dot(向量A,向量B)
>> a = [1;4;7]; b = [2;-1;5]; >> c = dot(a,b) c = 33
-
兩個向量的向量積(叉乘),
cross(向量A,向量B)
>> A = [1 2 3]; B = [2 3 4]; >> C = cross(A, B) C = -1 2 -1
-
使用括號(
向量(下標)
)引用向量的元素一個元素,注意在MATLAB中下標以1開始如果使用冒號(
v(:)
),等於告訴MATLAB 列出向量的所有元素:使用多個引用(
v(開始元素:結束元素)
),開始元素和結束元素都被計算在內>> A = [12 17 -2 0 4 4 11 19 27]; >> A(2) ans = 17 >> A(:) ans = 12 17 -2 0 4 4 11 19 27 >> A(2:5) ans = 17 -2 0 4
向量和矩陣的快速生成
-
==等差元素行向量==的生成
x = [首元素:步長:尾元素]
>> x = [0:2:10] x = 0 2 4 6 8 10
-
等差列向量的生成,即對生成的行向量進行轉置
x = [首元素:步長:尾元素]'
>> x = [0:2:10]' x = 0 2 4 6 8 10
-
生成一個==零矩陣==,
zeros(矩陣的階數)
>> zeros(4) ans = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-
生成一個==全部都是1的矩陣==,
ones(矩陣的階數)
>> ones(3) ans = 1 1 1 1 1 1 1 1 1
-
產生一個==主對角矩陣==,
diag(v,k)
v為向量,返回值為矩陣,以向量v的元素作為矩陣X的第k條對角線元素,當k=0時,v為X的主對角線;當k>0時,v為上方第k條對角線;當k<0時,v為下方第k條對角線。
>> v=[1 2 3]; >> x=diag(v,-1) x = 0 0 0 0 1 0 0 0 0 2 0 0 0 0 3 0
-
取主對角線的元素,
v=diag(X,k)
X為矩陣,v為向量
取矩陣X的第K條對角線元素為向量v
>> aa=randn(3,3) aa = -1.3282 -1.7925 0.4092 -0.3803 0.5858 -0.4684 -0.9560 0.7356 0.8292 >> diag(aa) ans = -1.3282 0.5858 0.8292 >> diag(aa,1) ans = -1.7925 -0.4684 >> diag(aa,2) ans = 0.4092
-
生成==單位矩陣==,
eye(矩陣的階數)
>> eye(3) ans = 1 0 0 0 1 0 0 0 1
-
取一個矩陣的下三角,
tial(矩陣)
>> tril(randn(3,3)) ans = 2.7694 0 0 -1.3499 -0.0631 0 3.0349 0.7147 1.4897
-
取一個矩陣的上三角,
triu(矩陣)
>> triu(randn(3,3)) ans = 1.4090 -1.2075 0.4889 0 0.7172 1.0347 0 0 0.7269
-
生成一個**魔術矩陣**,
magic(矩陣的階數)
數字1~9填到三行三列的表格中,要求每行、每列、及兩條對角線上的和都相等
>> magic(3) ans = 8 1 6 3 5 7 4 9 2
-
生成一個**pascal矩陣**,
pascal(矩陣的階數)
由楊輝三角形表組成的矩陣稱為帕斯卡(Pascal)矩陣。Pascal矩陣的第一行元素和第一列元素都為1,其餘位置處的元素是該元素的左邊元素加起上一行對應位置相加而得
>> pascal(5) ans = 1 1 1 1 1 1 2 3 4 5 1 3 6 10 15 1 4 10 20 35 1 5 15 35 70
矩陣的操作
-
提取全部元素為**絕對值**,
abs(矩陣)
>> randn(3,3) ans = 0.3252 -1.7115 0.3192 -0.7549 -0.1022 0.3129 1.3703 -0.2414 -0.8649 >> abs(ans) ans = 0.3252 1.7115 0.3192 0.7549 0.1022 0.3129 1.3703 0.2414 0.8649
-
矩陣的**數量乘**,
常數*矩陣
>> A = [-2 2; 4 1] A = -2 2 4 1 >> C = 2*A C = -4 4 8 2
-
矩陣的==加法(
矩陣+矩陣
),減法(矩陣-矩陣
),轉置==(矩陣'
)>> A=[1 2 3;4 5 6;7 8 9]; >> B=[10 11 12; 13 14 15; 16 17 18]; >> A+B ans = 11 13 15 17 19 21 23 25 27 >> A-B ans = -9 -9 -9 -9 -9 -9 -9 -9 -9 >> A' ans = 1 4 7 2 5 8 3 6 9
-
陣列乘法(點乘
.*
),和==除法==(.\
),即對應位置元素運算,需要兩矩陣行和列相同>> A=[1 2 3;4 5 6;7 8 9]; >> B=[10 11 12; 13 14 15; 16 17 18]; >> A.*B ans = 10 22 36 52 70 90 112 136 162 >> A./B ans = 0.1000 0.1818 0.2500 0.3077 0.3571 0.4000 0.4375 0.4706 0.5000
-
矩陣乘法(
矩陣*矩陣
)>> A=[1 2 3;4 5 6;7 8 9]; >> B=[10 11 12; 13 14 15; 16 17 18]; >> A*B ans = 84 90 96 201 216 231 318 342 366
-
數量與矩陣加法與減法,即這個數加在矩陣的每一個元素上面,
數量+矩陣
,數量-矩陣
>> A=[1 2 3;4 5 6;7 8 9]; >> A+5 ans = 6 7 8 9 10 11 12 13 14 >> A-5 ans = -4 -3 -2 -1 0 1 2 3 4 >> 5-A ans = 4 3 2 1 0 -1 -2 -3 -4
-
矩陣的乘方,
矩陣^次數
,注意此矩陣一定要為方陣>> A=[1 2 4; 1 5 7; 2 10 14] A = 1 2 4 1 5 7 2 10 14 >> A^3 ans = 211 1022 1444 391 1895 2677 782 3790 5354
矩陣的引用
-
使用
矩陣(行,列)
來引用某個元素,注意MATLAB裡面下標從1開始使用
:
來代替一整行或者一整列在某一行或者某一列選中某些元素,使用語法
開始下標:結束下標
>> A A = 1 2 3 4 5 6 7 8 9 >> A(2,2) ans = 5 >> A(:,2) ans = 2 5 8 >> A(1:2,2:3) ans = 2 3 5 6
-
使用
矩陣(行:列)=某個新值
來改變某一個元素的值同樣,使用
矩陣(:,某一列)=向量 或 矩陣(某一行,:)=向量
來改變某一行某一列的值,如果要刪除,則這個向量置空,比如矩陣(:,某一列)=[]
複製某一行或者列,
矩陣([要複製行的下標,要複製行的下標,...],:)
>>A A = -8 2 3 4 5 6 7 8 9 >> A(2,:)=[] A = -8 2 3 7 8 9 >> E = A([1,1,1,1],:) E = -8 2 3 -8 2 3 -8 2 3 -8 2 3 >> F = A([1,2,1],:) F = -8 2 3 7 8 9 -8 2 3
行列式和線性代數
-
求矩陣對應**行列式的值**,
det(矩陣)
>> A=[1 2 3;4 5 6;7 8 9]; >> det(A) ans = -9.5162e-16
-
矩陣的**秩**,
rank(矩陣)
>> A A = 1 2 3 4 5 6 7 8 9 >> rank(A) ans = 2
-
矩陣的**逆矩陣**,
inv(矩陣)
>> A=[1 2 4; 1 5 7; 8 3 2] A = 1 2 4 1 5 7 8 3 2 >> inv(A) ans = 0.2157 -0.1569 0.1176 -1.0588 0.5882 0.0588 0.7255 -0.2549 -0.0588 >> format rat >> ans ans = 11/51 -8/51 2/17 -18/17 10/17 1/17 37/51 -13/51 -1/17
-
最簡行階梯矩陣,
rref(矩陣)
>> A=[1 2 4; 1 5 7; 2 10 14] A = 1 2 4 1 5 7 2 10 14 >> rref(A) ans = 1 0 2 0 1 1 0 0 0
2.2 多項代數式相關
係數多項式
-
多項式的存貯使用係數向量來表示,稱為係數向量,比如 a x 4 + b x 3 + c x 2 + d x + e ax^4+bx^3+cx^2+dx+e ax4+bx3+cx2+dx+e 這個多項式可以使用五維向量
[a,b,c,d,e]
表示 -
多項式加法,直接將兩個係數向量相加即可,如果係數維度不同,低次的需要新增0向高次補齊。
-
多項式的乘法,使用函式
conv()
將兩個向量相乘,conv(多項式係數向量A,多項式係數向量B)
比如, x 4 + 8 x 3 − 10 x^4+8x^3-10 x4+8x3−10 與 2 x 2 − x + 3 2x^2-x+3 2x2−x+3 兩個相加
>> A=[1,8,0,0,-10]; >> B=[2,-1,3]; >> conv(A,B) ans = 2 15 -5 24 -20 10 -30
-
多項式除法,使用
deconv()
函式計算,[商式,餘式]=deconv(多項式A,多項式B)
>> p1=[1 2 0 0 -10]; >> p2=[2 -1 3]; >> [a,b]=deconv(p1,p2) a = 0.5000 1.2500 -0.1250 b = 0 0 0 -3.8750 -9.6250
-
多項式求導數,函式
polyder()
導數=polyder(多項式)
求多項式p1的導數導數=polyder(多項式A,多項式B)
求多項式p1和p2乘積的導數[分子表示式,分母表示式]=polyder(多項式分子,多項式分母)
多項式p1和p2之商的導數
>> p1=[1 2 0 0 -10]; >> p2=[2 -1 3]; >> [p,q]=polyder(p1,p2) p = 4 1 8 18 40 -10 q = 4 -4 13 -6 9
-
求多項式在某點的值,函式
polyval()
,結果=polyval(係數向量,自變數向量)
>> p=[1,2,1]; >> ans=polyval(p,1:5) ans = 4 9 16 25 36
-
求多項式的根,
結果向量=roots(係數向量)
>> p=[1,2,1]; >> roots(p) ans = -1 -1
符號代數式
-
要使用符號代數,需要提前定義符號變數,即要生成一個符號物件,可以利用
sym
以及syms
函式,sym
可以生成單個符號物件,而syms
可以生成多個符號物件,符號物件的運算是完全精確的,沒有舍入誤差。例如:a = sym(‘5’);
syms b c d;
-
在符號代數等式中,使用雙等於
==
來表示符號代數式中的等於符號 ( = = =) ,使用~=
表示符號代數式中不等於符號( ≠ \neq = ),比如代數式 x 2 + 3 x − 10 = 2 y x^2+3x-10=2y x2+3x−10=2y 可以表示為:>> clear all >> syms x y >> eq = x^2 + 3*x - 10==2*y eq = x^2 + 3*x - 10 == 2*y
-
解方程,使用
solve()
函式進行求解,Symbolic solution of algebraic equations.
S = solve(eqn1,eqn2,...,eqnM,var1,var2,...,varN)
S = solve(eqn1,eqn2,...,eqnM,var1,var2,...,varN,'ReturnConditions',true)
-
即
[未知變數組]=solve(方程A,方程B,...,方程N,變數A,變數B,...,變數N)
但是在2019版本中出現了更新,如下:
>> syms x y z >> eq1 = 'x^2 + sin(y) - z = 100'; >> eq2 = 'x - y + z = 5'; >> eq3 = 'x * z + cos(y) = 6 * z'; >> [x, y, z] = solve(eq1, eq2, eq3, 'x', 'y', 'z'); 錯誤使用 solve>getEqns (line 418) List of equations must not be empty. 出錯 solve (line 226) [eqns, vars, options] = getEqns(varagin[:]);
問題出在:
matlab 2019 中已經不接受向 solve 中傳入字串。我們需要對方程組改進如下:
- 為
eq
賦值時去掉等號; - 將
表示公式的等式
中的=
改成==
表示條件判斷; - 在
solve
中去掉符號的單引號。
即如下:
>> syms x y z >> eq1 = x^2 + sin(y) - z == 100; >> eq2 = x - y + z == 5; >> eq3 = x * z + cos(y) == 6 * z; >> [x, y, z] = solve(eq1, eq2, eq3, x, y, z);
- 為
-
求帶常數引數的方程,同樣使用
solve
函式>> syms a x >> solve(a*x+8==0) ans = -8/a
-
solve
函式遇到的其他問題,我們會遇到解方程的時候答案不是數值解,這個時候我們可以使用變數轉換來得到數值解>> syms x; >> eq=x^4 - 5*x^3 + 4*x^2 - 5*x + 6==0; >> solve(eq) ans = root(z^4 - 5*z^3 + 4*z^2 - 5*z + 6, z, 1) root(z^4 - 5*z^3 + 4*z^2 - 5*z + 6, z, 2) root(z^4 - 5*z^3 + 4*z^2 - 5*z + 6, z, 3) root(z^4 - 5*z^3 + 4*z^2 - 5*z + 6, z, 4) >> double(ans) ans = 1.1164 + 0.0000i -0.1876 - 1.1076i -0.1876 + 1.1076i 4.2588 + 0.0000i
-
solve
函式解方程組,結果存在一個結構體之中,要訪問它,需要使用結構體的引用方法,如:>> clear >> syms x y z >> eq1 = x^2 + sin(y) - z == 100; >> eq2 = x - y + z == 5; >> eq3 = x * z + cos(y) == 6 * z; >> a = solve(eq1, eq2, eq3, x, y, z); 警告: Unable to solve symbolically. Returning a numeric solution using vpasolve. %這裡的警告是指沒有找不到絕對的解,給出的數值解 > In solve (line 304) >> a.x ans = 10.044861348830706718130912031098 >> a.y ans = 4.9795861545146561508942123172393 >> a.z ans = -0.06527519431605056723669971385847
-
方程展開,比如展開代數式 ( x + 2 ) ( x − 3 ) (x+2)(x-3) (x+2)(x−3) 為代數式 x 2 − x − 6 x^2-x-6 x2−x−6 ,我們使用
expand()
函式>> clear >> syms x >> eq=(x+2)*(x-3); >> expand(eq) ans = x^2 - x - 6 >> syms x y >> eq=sin(x+y); >> expand(eq) ans = cos(x)*sin(y) + cos(y)*sin(x)
-
因式分解,是方程展開的逆操作,使用
factor()
函式,我們對上面的展開代數式操作>> syms x; >> eq=(x+2)*(x-3); >> eq=expand(eq); >> factor(eq) ans = [ x + 2, x - 3]
-
合併同類項,使用
collect()
函式,在沒有定義的時候按預設x合併答案=collect(代數式)
答案=collect(代數式,指定變數)
>> clear >> syms x y >> factor(x^2-y^2) ans = [ x - y, x + y]
ly. Returning a numeric solution using vpasolve. %這裡的警告是指沒有找不到絕對的解,給出的數值解
In solve (line 304)
a.x
ans =
10.044861348830706718130912031098
a.y
ans =
4.9795861545146561508942123172393
a.z
ans =
-0.06527519431605056723669971385847
- 方程展開,比如展開代數式 $(x+2)(x-3)$ 為代數式 $x^2-x-6$ ,我們使用 `expand()` 函式
```matlab
>> clear
>> syms x
>> eq=(x+2)*(x-3);
>> expand(eq)
ans =
x^2 - x - 6
>> syms x y
>> eq=sin(x+y);
>> expand(eq)
ans =
cos(x)*sin(y) + cos(y)*sin(x)
-
因式分解,是方程展開的逆操作,使用
factor()
函式,我們對上面的展開代數式操作>> syms x; >> eq=(x+2)*(x-3); >> eq=expand(eq); >> factor(eq) ans = [ x + 2, x - 3]
-
合併同類項,使用
collect()
函式,在沒有定義的時候按預設x合併答案=collect(代數式)
答案=collect(代數式,指定變數)
>> clear >> syms x y >> factor(x^2-y^2) ans = [ x - y, x + y]