matlab第二天學習筆記
2.11 表示式
2.11.1 變數
與大多數其他程式語言一樣,MATLAB 語言提供數學表示式,但與大多數程式語言不同的是,這些表示式涉及整個矩陣。
MATLAB 不需要任何型別宣告或維度說明。當 MATLAB 遇到新的變數名稱時,它會自動建立變數,並分配適當大小的儲存。如果此變數已存在,MATLAB 會更改其內容,並根據需要分配新儲存。
例如,num_students = 25
建立一個名為 num_students 的 1×1 矩陣,並將值 25 儲存在該矩陣的單一元素中。要檢視分配給任何變數的矩陣,只需輸入變數名稱即可。
變數名稱包括一個字母,後面可以跟隨任意數目的字母、數字或下劃線。MATLAB 區分大小寫;它可以區分大寫和小寫字母。A 和 a 不是相同變數。
儘管變數名稱可以為任意長度,MATLAB 僅使用名稱的前 N 個字元(其中 N 是函式 namelengthmax 返回的數字),並忽略其餘字元。因此,很重要的一點是,應使每個變數名稱的前 N 個字元保持唯一,以便 MATLAB 能夠區分變數。
N = namelengthmax
N =
63
2.11.2 數字
MATLAB 使用傳統的十進位制記數法以及可選的小數點和前導加號或減號來表示數字。科學記數法使用字母 e 來指定 10 次方的縮放因子。虛數使用 i 或 j 作為字尾。下面給出了合法數字的一些示例:
3 -99 0.0001 9.6397238 1.60210e-20 6.02252e23 1i -3.14159j 3e5i
MATLAB 使用 IEEE 浮點標準規定的 long 格式在內部儲存所有數字。浮點數的有限精度約為 16 位有效小數位數,有限範圍約為 10-308 至 10+308。
以雙精度格式表示的數字的最大精度為 52 位。任何需要 52 位以上的雙精度數字都會損失一定精度。例如,下面的程式碼因截斷而將兩個不相等的值顯示為相等:
x = 36028797018963968;
y = 36028797018963972;
x == y
ans =
1
整數的可用精度為 8 位、16 位、32 位和 64 位。將相同數字儲存為 64 位整數會保留精度:
x = uint64(36028797018963968); y = uint64(36028797018963972); x == y ans = 0
MATLAB 軟體儲存複數的實部和虛部。該軟體根據上下文采用不同方法來處理各個部分的量值。例如,sort 函式根據量值進行排序,如果量值相等,則根據相位角度排序。
sort([3+4i, 4+3i])
ans =
4.0000 + 3.0000i 3.0000 + 4.0000i
這是由相位角度所致:
angle(3+4i)
ans =
0.9273
angle(4+3i)
ans =
0.6435
“等於”關係運算符 == 要求實部和虛部相等。其他二進位制關係運算符 >、<、>= 和 <= 忽略數字的虛部,而僅考慮實部。
2.11.3 矩陣運算子
表示式使用大家熟悉的算術運算子和優先法則。
+ | 加法 |
---|---|
- | 減法 |
* | 乘法 |
/ | 除法 |
\ | 左除 |
^ | 冪 |
‘ | 複共軛轉置 |
() | 指定計算順序 |
2.11.4 陣列運算子
如果矩陣不用於線性代數運算,則成為二維數值陣列。陣列的算術運算按元素執行。這意味著,加法和減法運算對陣列和矩陣都是相同的,但乘法運算不相同。MATLAB 的乘法陣列運算表示法中包含點,也就是小數點。
運算子列表包括
+ | 加法 |
---|---|
- | 減法 |
.* | 逐元素乘法 |
./ | 逐元素除法 |
.\ | 逐元素左除 |
.^ | 逐元素冪 |
.‘ | 非共軛陣列轉置 |
如果使用陣列乘法將丟勒的幻方矩陣自乘
A.*A
則會生成一個數組,該陣列包含介於 1 至 16 之間的整數的平方,並且以不常見的順序排列:
ans =
256 9 4 169
25 100 121 64
81 36 49 144
16 225 196 1
構建表
陣列運算對構建表非常有用。假定 n 為列向量
n = (0:9)';
然後,
pows = [n n.^2 2.^n]
構建一個平方和 2 次冪的表:
pows =
0 0 1
1 1 2
2 4 4
3 9 8
4 16 16
5 25 32
6 36 64
7 49 128
8 64 256
9 81 512
初等數學函式逐元素處理陣列元素。因此
format short g
x = (1:0.1:2)';
logs = [x log10(x)]
構建一個對數表。
logs =
1.0 0
1.1 0.04139
1.2 0.07918
1.3 0.11394
1.4 0.14613
1.5 0.17609
1.6 0.20412
1.7 0.23045
1.8 0.25527
1.9 0.27875
2.0 0.30103
2.11.5 函式
MATLAB 提供了大量標準初等數學函式,包括 abs、sqrt、exp 和 sin。生成負數的平方根或對數不會導致錯誤;系統會自動生成相應的複數結果。MATLAB 還提供了許多其他高等數學函式,包括貝塞爾函式和 gamma 函式。其中的大多數函式都接受複數引數。有關初等數學函式的列表,請鍵入
help elfun
有關更多高等數學函式和矩陣函式的列表,請鍵入
help specfun
help elmat
某些函式(例如,sqrt 和 sin)是內建函式。內建函式是 MATLAB 核心的一部分,因此這些函式非常高效,但計算詳細資訊是不可訪問的。其他函式使用 MATLAB 程式語言實現,因此可以訪問其計算詳細資訊。
內建函式與其他函式之間存在一些差異。例如,對於內建函式,您看不到程式碼。對於其他函式,您可以看到程式碼,甚至可以根據需要修改程式碼。
一些特殊函式提供了有用的常量值。
pi | 3.14159265... |
---|---|
i | 虛數單位 |
j | 與 i 相同 |
eps | 浮點相對精度 |
realmin | 最小浮點數 |
realmax | 最大浮點數 |
Inf | 無窮大 |
NaN | 非數字 |
通過將非零值除以零或計算明確定義的溢位(即超過 realmax)的數學表示式,會生成無窮大。通過嘗試計算 0/0 或 Inf-Inf 等沒有明確定義的數值的表示式,會生成非數字。
函式名稱不會保留。您可以使用如下新變數覆蓋任何函式名稱
eps = 1.e-6
並在後續計算中使用該值。可以使用以下命令恢復原始函式
clear eps
2.11.6 表示式示例
您已經學習了 MATLAB 表示式的幾個示例。下面是一些其他示例及生成的值:
rho = (1+sqrt(5))/2
rho =
1.6180
a = abs(3+4i)
a =
5
z = sqrt(besselk(4/3,rho-i))
z =
0.3730+ 0.3214i
huge = exp(log(realmax))
huge =
1.7977e+308
toobig = pi*huge
toobig =
Inf
2.12 輸入命令
2.12.1 format 函式
format
函式控制所顯示的值的數值格式。此函式僅影響數字顯示方式,而不會影響 MATLAB 軟體如何計算或儲存數字。下面提供了不同格式及由向量 x
生成的最終輸出,該向量的各個分量具有不同的量值。
注意
為了確保適當的間隔,請使用等寬字型,例如 Courier。
x = [4/3 1.2345e-6]
format short
1.3333 0.0000
format short e
1.3333e+000 1.2345e-006
format short g
1.3333 1.2345e-006
format long
1.33333333333333 0.00000123450000
format long e
1.333333333333333e+000 1.234500000000000e-006
format long g
1.33333333333333 1.2345e-006
format bank
1.33 0.00
format rat
4/3 1/810045
format hex
3ff5555555555555 3eb4b6231abfd271
如果矩陣的最大元素大於 103 或小於 10-3,MATLAB 會對短格式和長格式應用常用縮放因子。
除了上面顯示的 format
函式,
format compact
會不顯示在輸出中出現的多個空行。這樣,您可以在螢幕或視窗中檢視更多資訊。如果要進一步控制輸出格式,請使用 sprintf
和 fprintf
函式。
2.11.2 取消輸出
如果您在僅鍵入語句後按 Return 或 Enter,MATLAB 會在螢幕上自動顯示結果。但是,如果使用分號結束行,MATLAB 會執行計算,但不會顯示任何輸出。當生成大型矩陣時,此功能尤其有用。例如,
A = magic(100);
2.11.3 輸入長語句
如果語句無法容納在一行中,請使用省略號(三個句點)...
,後跟 Return 或 Enter 以指示該語句在下一行繼續。例如,
s = 1 -1/2 + 1/3 -1/4 + 1/5 - 1/6 + 1/7 ...
- 1/8 + 1/9 - 1/10 + 1/11 - 1/12;
=
、+
和 - 符號周圍的空白是可選的,但可提高可讀性。
2.11.4 命令列編輯
使用鍵盤上的各個箭頭鍵和控制鍵可以重新呼叫、編輯和重用先前鍵入的語句。例如,假定您錯誤地輸入了
rho = (1 + sqt(5))/2
sqrt
的拼寫不正確。MATLAB 會給出以下錯誤資訊
Undefined function 'sqt' for input arguments of type 'double'.
您只需按 ↑ 鍵,而不必重新鍵入整行。系統將重新顯示鍵入的語句。使用 ← 鍵移動游標並插入缺少的 r
。反覆使用 ↑ 鍵可重新呼叫前面的行。鍵入幾個字元並按 ↑ 鍵可查詢前文中以這些字元開頭行。還可以從命令歷史記錄中複製以前執行的語句。
2.13 索引
2.13.1 下標
A
的行 i
和列 j
中的元素通過 A(i,j)
表示。例如,A(4,2)
表示第四行和第二列中的數字。在幻方矩陣中,A(4,2)
為 15
。因此,要計算 A
第四列中的元素的總和,請鍵入
A(1,4) + A(2,4) + A(3,4) + A(4,4)
此下標生成
ans =
34
但這不是計算某列總和的最佳方法。
此外,還可以使用單一下標 A(k)
引用矩陣的元素。單一下標是引用行和列向量的常見方法。但是,也可以對滿二維矩陣應用單一下標。在這種情況下,陣列被視為一個由原始矩陣的列構成的長列向量。因此,在幻方矩陣中,A(8)
是另一種引用儲存在 A(4,2)
中的值 15
的方法。
如果嘗試使用矩陣外部元素的值,則會生成錯誤:
t = A(4,5)
% 索引超出矩陣維度。
相反,如果將值儲存在矩陣外部元素中,則會增大大小以便容納新元素:
X = A;
X(4,5) = 17
X =
16 3 2 13 0
5 10 11 8 0
9 6 7 12 0
4 15 14 1 17
2.13.2 冒號運算子
冒號 :
是最重要的 MATLAB 運算子之一。它以多種不同形式出現。表示式1:10
是包含從 1 到 10 之間的整數的行向量:1 2 3 4 5 6 7 8 9 10
要獲取非單位間距,請指定增量。例如,100:-7:50
為100 93 86 79 72 65 58 51
而0:pi/4:pi
為0 0.7854 1.5708 2.3562 3.1416
包含冒號的下標表達式引用部分矩陣:A(1:k,j)
表示 A
第 j
列中的前 k
個元素。因此,sum(A(1:4,4))
計算第四列的總和。
但是,執行此計算有一種更好的方法。冒號本身引用矩陣行或列中的所有元素,而關鍵字 end
引用最後一個行或列。因此,sum(A(:,end))
計算 A
最後一列中的元素的總和:
ans =
34
為什麼 4×4 幻方矩陣的幻數和等於 34?如果將介於 1 到 16 之間的整數分為四個總和相等的組,該總和必須為
sum(1:16)/4
當然,也即
ans =
34
2.13.3 串聯
串聯是連線小矩陣以便形成更大矩陣的過程。實際上,第一個矩陣是通過將其各個元素串聯起來而構成的。成對的方括號 []
即為串聯運算子。例如,從 4×4 幻方矩陣 A
開始,組成
B = [A A+32; A+48 A+16]
結果會生成一個 8×8 矩陣,這是通過連線四個子矩陣獲得的:
B =
16 3 2 13 48 35 34 45
5 10 11 8 37 42 43 40
9 6 7 12 41 38 39 44
4 15 14 1 36 47 46 33
64 51 50 61 32 19 18 29
53 58 59 56 21 26 27 24
57 54 55 60 25 22 23 28
52 63 62 49 20 31 30 17
此矩陣是一個接近於幻方矩陣的矩陣。此矩陣的元素是經過重新排列的整數 1:64
。此矩陣的列總和符合 8×8 幻方矩陣的要求:
sum(B)
ans =
260 260 260 260 260 260 260 260
但是其行總和 sum(B')'
並不完全相同。要使其成為有效的 8×8 幻方矩陣,需要進行進一步操作。
2.13.4 刪除行和列
只需使用一對方括號即可從矩陣中刪除行和列。首先
X = A;
然後,要刪除 X
的第二列,請使用
X(:,2) = []
這會將 X
更改為
X =
16 2 13
5 11 8
9 7 12
4 14 1
如果您刪除矩陣中的單個元素,結果將不再是矩陣。因此,以下類似表示式
X(1,2) = []
將會導致錯誤。但是,使用單一下標可以刪除一個元素或元素序列,並將其餘元素重構為一個行向量。因此
X(2:2:10) = []
生成
X =
16 9 2 7 13 12 1
2.13.5 標量擴充套件
可以採用多種不同方法將矩陣和標量合併在一起。例如,通過從每個元素中減去標量而將其從矩陣中減去。幻方矩陣的元素平均值為 8.5,因此
B = A - 8.5
形成一個列總和為零的矩陣:
B =
7.5 -5.5 -6.5 4.5
-3.5 1.5 2.5 -0.5
0.5 -2.5 -1.5 3.5
-4.5 6.5 5.5 -7.5
sum(B)
ans =
0 0 0 0
通過標量擴充套件,MATLAB 會為範圍中的所有索引分配一個指定標量。例如,
B(1:2,2:3) = 0
將 B
的某個部分清零:
B =
7.5 0 0 4.5
-3.5 0 0 -0.5
0.5 -2.5 -1.5 3.5
-4.5 6.5 5.5 -7.5
2.13.6 邏輯下標(重要)
根據邏輯和關係運算建立的邏輯向量可用於引用子陣列。假定 X
是一個普通矩陣,L
是一個由某個邏輯運算生成的同等大小的矩陣。那麼,X(L)
指定 X
的元素,其中 L
的元素為非零。
通過將邏輯運算指定為下標表達式,可以在一個步驟中完成這種下標。假定您具有以下資料集:
x = [2.1 1.7 1.6 1.5 NaN 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8];
NaN
是用於缺少的觀測值的標記,例如,無法響應問卷中的某個項。要使用邏輯索引刪除缺少的資料,請使用 isfinite(x)
,對於所有有限數值,該函式為 true;對於 NaN
和 Inf
,該函式為 false:
x = x(isfinite(x))
x =
2.1 1.7 1.6 1.5 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8
現在,存在一個似乎與其他項很不一樣的觀測值,即 5.1
。這是一個離群值。下面的語句可刪除離群值,在本示例中,即比均值大三倍標準差的元素:
x = x(abs(x-mean(x)) <= 3*std(x))
x =
2.1 1.7 1.6 1.5 1.9 1.8 1.5 1.8 1.4 2.2 1.6 1.8
標量擴充套件對於另一示例,請使用邏輯索引和標量擴充套件將非質數設定為 0,以便高亮顯示丟勒幻方矩陣中的質數的位置。(請參閱 magic 函式。)
A(~isprime(A)) = 0
A =
0 3 2 13
5 0 11 0
0 0 7 0
0 0 0 0
2.13.7 find 函式
find
函式可用於確定與指定邏輯條件相符的陣列元素的索引。find
以最簡單的形式返回索引的列向量。轉置該向量以便獲取索引的行向量。例如,再次從丟勒的幻方矩陣開始。(請參閱 magic 函式)
k = find(isprime(A))'
使用一維索引選取幻方矩陣中的質數的位置:
k =
2 5 9 10 11 13
使用以下命令按 k
確定的順序將這些質數顯示為行向量
A(k)
ans =
5 3 2 11 7 13
將 k
用作賦值語句的左側索引時,會保留矩陣結構:
A(k) = NaN
A =
16 NaN NaN NaN
NaN 10 NaN 8
9 6 NaN 12
4 15 14 1
本文來自部落格園,作者:ahrismile,轉載請註明原文連結:https://www.cnblogs.com/ahrismile/p/15127633.html