MATLAB 程式設計/陣列/陣列操作簡介
由於陣列是 MATLAB 中的基本資料結構,因此瞭解如何有效地使用它們非常重要。 請參見上一節以瞭解相關內容。
MATLAB 中的陣列遵循與數學對應項相同的規則:預設情況下,使用運算的矩陣定義,除非應用名為點運算子的特殊運算子。
由於陣列運算與等效的數學運算非常相似,因此有效使用 matlab 需要具備線性代數的基本知識。 但是,在使用向量和矩陣這兩個術語時,我們不會像在數學中那樣精確。 在 MATLAB 中,兩者都是雙精度陣列(因此在真實的數學意義上是矩陣),MATLAB 將向量視為僅有一行或僅有一列的矩陣。 但是,有一些專門針對向量的函式;請參見向量模組以瞭解如何使用這些函式。
現在您已經瞭解如何定義一個簡單的陣列,您應該瞭解如何訪問其元素。 透過運算子 () 訪問陣列的內容,在括號內包含索引;第一個元素的索引為 1
>> a = [1, 2, 3];
>> a(1)
ans =
1
>> a(3)
ans =
3
訪問超出邊界的元素會導致錯誤
>> a(5) ??? Index exceeds matrix dimensions.
要訪問單個矩陣元素,可以使用 (i,j) 下標,其中 i 是行中的索引,j 是列中的索引
>> a= [1, 2; 3, 4];
>> a(1, 2)
ans =
2
>> a(2, 1)
ans =
3
您也可以透過唯一索引訪問矩陣元素;在這種情況下,順序為列優先,這意味著您首先遍歷第一列的所有元素,然後遍歷第二列,依此類推... 列優先模式與 Fortran 中相同,與 C 語言中的順序相反。
>> a = [1, 2, 3; 4, 5, 6];
>> a(3)
ans =
2
還可以使用冒號 (:) 運算子訪問矩陣塊。 此運算子就像一個萬用字元;它告訴 MATLAB 您想要訪問給定維度的所有元素或索引在兩個給定值之間的所有元素。 例如,假設您想訪問矩陣 a 以上的整行,但不想訪問第二行。 然後您可以編寫
>> a = [1, 2, 3; 4, 5, 6]; >> a(1,:) %row 1, every column ans = 1 2 3
現在假設您只想訪問第一行中的前兩個元素。 為此,請使用以下語法
>> a = [1, 2, 3; 4, 5, 6]; >> a(1, 1:2) ans = 1 2
語法 a(:) 將 a 更改為列向量(列優先)
>> a = [1, 2, 3; 4, 5, 6] >> a(:) ans = 1 4 2 5 3 6
最後,如果您不知道陣列的大小,但希望訪問從某個索引到陣列末尾的所有元素,請使用 end 運算子,例如
>> a = [1, 2, 3; 4, 5, 6] >> a(1, 2:end) %row 1, columns from 2 until end of the array ans = 2 3
除了索引定址之外,您還可以訪問僅滿足某些邏輯條件的陣列元素。 例如,假設 a = [1.1, 2.1, 3.2, 4.5],您只想訪問 2 到 4 之間的元素。 然後您可以透過兩種方法實現。 第一種是使用find函式查詢陣列中 2 到 4 之間的所有數字的索引,然後使用這些索引訪問陣列
>> a = [1.1, 2.1, 3.2, 4.5]; >> INDICES = find(a >= 2 & a <= 4); >> a(INDICES) ans = 2.1 3.2
這在 MATLAB 2006b 中不起作用。
第二種方法是使用邏輯定址,它首先將 a 轉換為一個邏輯陣列,如果邏輯表示式為真則值為 1,如果為假則值為 0。然後它找到並返回 a 中所有為真的值。這種方法的語法如下所示:
>> a = [1.1, 2.1, 3.2, 4.5]; >> a(a >= 2 & a <= 4) ans = 2.1 3.2
當然,有趣的部分是將一些運算應用於這些陣列。例如,您可以使用經典的算術運算 + 和 - 對 MATLAB 中的任何陣列進行運算:這將導致經典向量向量空間 中定義的向量加法和減法,這僅僅是元素級別的加法和減法。
>> [1, 2, 3] - [1, 2, 1] ans = 0 0 2
乘以標量也按預期工作。
>> 2 * [1, 2, 3] ans = [2, 4, 6]
乘法和除法問題更大:在 中乘以兩個向量沒有意義。它只有在矩陣上下文中才有意義。在 MATLAB 中使用符號 * 計算矩陣乘積,只有當左運算元的列數與右運算元的行數匹配時才定義。
>> a = [1, 2; 3, 4]; >> a * a ans =
7 10 15 22
>> a = [1, 2, 3]; b = [1; 2; 3]; >> a * a ??? Error using ==> * Inner matrix dimensions must agree. >> a * b ans = 14
使用除法符號 / 具有更多約束,因為它要求右運算元可逆(參見 維基百科:可逆矩陣)。對於方陣, 等價於 。例如
>> a = [1, 2; 3, 4]; b = [1, 2; 1, 2]
>> b / a
ans =
1 0
1 0
>> a / b Warning: Matrix is singular to working precision. ans = Inf Inf Inf Inf
如果您希望逐元素地乘以或除以兩個矩陣或向量,或者將一個矩陣的所有元素提升到相同的冪,而不是使用這些運算子的矩陣定義,您可以使用點 (.) 運算子。兩個矩陣必須具有相同的維度。例如,對於乘法,
>> a = [1, 2, 3]; >> b = [0, 1, 2]; >> a .* b ans = 0 2 6
另外兩個逐元素運算子是 ./ 和 .^。
由於 MATLAB 是一種數值計算語言,您應該牢記,理論上可逆的矩陣可能會導致精度問題,從而導致結果不精確,甚至完全錯誤。上面的訊息“矩陣對於工作精度來說是奇異的”應該在這些情況下出現,這意味著結果不可信。
非方陣也可以用作 / 的右運算元;在這種情況下,它計算 偽逆。這在最小二乘問題中特別有用。
矩陣的轉置使用 .' 獲取。
>> array = [1,2;3,4]
array =
1 2
3 4
>> array.'
ans =
1 3
2 4
與可用於點值的相同布林運算子也可用於比較陣列。為此,MATLAB 逐元素地比較元素,並在與正在比較的兩個陣列大小相同的邏輯陣列中返回它們。兩個陣列必須具有相同的大小。例如,
>> A = [2,4], B = [1,5];
>> A < B
ans =
[0 1]
在將陣列之間的比較用作迴圈條件時,您必須小心,因為它們顯然不會返回單個值,因此會導致結果不明確。迴圈條件應該可以簡化為單個布林值,T 或 F,而不是陣列。執行此操作的兩種常用方法是“any”和“all”函式。函式呼叫 any(array) 將在array 包含任何非零值時返回 true,如果所有值為零則返回 false。它首先在一個方向上進行比較,然後在另一個方向上進行比較,因此要減少矩陣,您必須兩次呼叫 any 函式。類似地,函式all僅當給定行或列中的所有元素都為非零時才返回 true。
連線陣列涉及將陣列貼上在一起。
水平連線是透過將陣列視為包含在行中的變數來完成的。
>> a = [1,2;3,4];
>> b = [5,6;7,8];
>> c = [a,b]
c =
1 2 5 6
3 4 7 8
垂直連線是透過將陣列視為包含在列中的變數來完成的。
>> a = [1,2;3,4];
>> b = [5,6;7,8];
>> c = [a;b]
c =
1 2
3 4
5 6
7 8
要以 Ax = b 的形式求解線性方程組,請使用 "\" 運算子。
示例
>>A = [4 5 ; 2 8];
b = [23 28]';
x = A\b
x =
2
3