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包含任何非零值,則返回真,如果所有值都為零,則返回假。它首先在一個方向上執行比較,然後在另一個方向上執行比較,因此要減少矩陣,您必須兩次呼叫 any 函式。類似地,all 函式僅當給定行或列中的所有元素均為非零時才返回真。
連線陣列涉及將陣列粘合在一起。
水平連線是透過將陣列視為包含在行中的變數來完成的。
>> 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