Matlab 基礎知識-3

矩陣 (Matrices)

變數 (Variables) 在給予陣列賦值時,需以方括號 [] 作為開頭和結尾,以英文逗號 ,空格分割同行元素,以英文分號 ; 分割各列。
例如在 Command Window 裡輸入

1
2
3
4
5
6
% 以下為輸入指令
>> a = [1 2;3 4]
% 會看到以下輸出結果
a =
1 2
3 4

Info

程式識別順序為先列再行

同時 Workspace 會出現田字形變數 a,說明 a 為數值型變數。

向量 (Vectors) & 數值 (Numeric)

向量 (Vectors) & 數值 (Numeric) 在 Matlab中,兩者可以視為特殊矩陣。

向量 (Vectors)

a=[1 2] 對應為列向量 (Row)。

1
2
3
4
5
% 以下為輸入指令
>> a=[1 2]
% 以下為輸出結果
a =
1 2

a=[1;2] 對應為行向量 (Column)。

1
2
3
4
5
6
% 以下為輸入指令
>> a=[1;2]
% 以下為輸出結果
a =
1
2

數值 (Numeric)

在對單一數值 (Numeric) 做變數宣告時 a=[1],可以簡寫為 a=1

向量 (Vectors) & 數值 (Numeric) 運算方式

向量 (Vectors) & 數值 (Numeric) 都是矩陣 (Matrices),矩陣之間最基本的運算有加、減、乘、除、次方、轉置,運算符分別對應的是+-*/^,與數學中一般表示無異,後續說明矩陣的運算方式。

先設立變數 a=[1 2]b=[1 3]c=[1;2]

1
2
3
4
5
6
7
8
9
10
11
12
% 以下為輸入指令
>> a=[1 2]
>> b=[1 3]
>> c=[1;2]
% 以下為輸出結果
a =
1 2
b =
1 3
c =
1
2

矩陣加減法

矩陣加減法與一般的數學計算沒什麼不同,但值得注意的是,不同階的矩陣,在新版的 Matlab 中,會自動擴展矩陣進行計算,以下為範例
a=[1 2]b=[1 3]c=[1;2]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
% 以下為輸入指令
>> d=a+b
% 以下為輸出結果
d =
2 5

% 以下為輸入指令
>> d=a-b
% 以下為輸出結果
d =
0 -1

% 以下為輸入指令
>> d=a+c %不同階的矩陣,在新版的 Matlab 中,會自動擴展矩陣進行計算
% 以下為輸出結果
d =
2 3
3 4

矩陣乘除法

矩陣乘法只有第一個矩陣的行數等於第二個矩陣的列數時,才能進行,以下為範例
a=[1 2]b=[1 3]c=[1;2]

1
2
3
4
5
6
% 以下為輸入指令
>> d=a*c
% 以下為輸出結果
d =
5
% 這種計算方式符合規則是可以進行的
1
2
3
4
5
6
7
8
% 以下為輸入指令
>> d=a*b
% 以下為輸出結果
Error using *
Incorrect dimensions for matrix multiplication. Check that the number of columns in the
first matrix matches the number of rows in the second matrix. To perform elementwise
multiplication, use '.*'.
% 這種計算在數學上沒有定義,需要使用到 .* 符號,後續會說明

另外也可以以下方式進行計算

1
2
3
4
5
6
7
8
9
10
11
% 以下為輸入指令
>> [1*4 2*5 3*6]
% 以下為輸出結果
ans =
4 10 18

% 以下為輸入指令
>> [1/4 2/5 3/6]
% 以下為輸出結果
ans =
0.2500 0.4000 0.5000

此外矩陣與數的乘除,由於數可以看做 1*1 的矩陣,計算方式如下

1
2
3
4
5
6
7
8
9
10
11
% 以下為輸入指令
>> d=a*2
% 以下為輸出結果
d =
2 4

% 以下為輸入指令
>> d=a/2
% 以下為輸出結果
d =
0.5000 1.0000

次方

如果 A 為方陣正數,則 A^p 可以將 A 乘以其自身 p 次方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
% 以下為輸入指令
>> A = [1 1 1;1 2 3;1 3 6]
% 以下為輸出結果
A =
1 1 1
1 2 3
1 3 6

% 以下為輸入指令
>> d = A^2
% 以下為輸出結果
d =
3 6 10
6 14 25
10 25 46
% A^2 語法等於 A*A

如果 A 為方陣負數,則 A^(-p) 可以將 A 乘以其自身 -p 次方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% 以下為輸入指令
>> A = [1 1 1;1 2 3;1 3 6]
% 以下為輸出結果
A =
1 1 1
1 2 3
1 3 6

% 以下為輸入指令
>> d = A^(-1)
% 以下為輸出結果
d =
3 -3 1
-3 5 -2
1 -2 1

另外元素 (element) 之間,也可以用次方做計算,計算方式如下

1
2
3
4
5
% 以下為輸入指令
>> [1^3 2^3 3^3]
% 以下為輸出結果
ans =
1 8 27

特殊運算符號

Matlab 提供了一些特殊的運算符號,除了剛剛所提到的點乘 .*,還有其他例如點除 ./ 和點方 .^,這些運算符在本身的運算符前加一個點,這些運算符有很多叫法,比如 .*,一般稱為點乘元素乘數乘,這些叫法都是為了讓這個運算符區別於普通的乘法。簡單而言,這些運算的含義是將矩陣作為一般的數來進行運算。

  • 點計算是數組的運算,不加點是矩陣的運算
  • 點乘除要求參與運算的兩個向量兩必須是維數相同,是對應元素的相乘除
  • 不加點表示的是矩陣相乘除(除的時候通過逆矩陣來實現),要求內維相同,也就是前一個矩陣的行的維數等於後一個矩陣的列的維數。

.* 運算符號執行按元素乘法,允許將兩個大小相同的數組的對應元素相乘
a=[1 2]b=[1 3]c=[1;2]

1
2
3
4
5
% 以下為輸入指令
>> d=a.*b
% 以下為輸出結果
d =
1 6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
% 以下為輸入指令
>> [1 2 3].*[4 5 6]
% 以下為輸出結果
ans =
4 10 18

% 以下為輸入指令
>> [1 2 3]./[4 5 6]
% 以下為輸出結果
ans =
0.2500 0.4000 0.5000

% 以下為輸入指令
>> [1 2 3].^3
% 以下為輸出結果
ans =
1 8 27

Warning

特別注意只有同樣維度的矩陣才能進行這種特殊運算。另外點除還要注意不要除以零,除以零在數學上沒有定義,所以這種除法其實已經失去了意義。

轉置

任何維度的矩陣都可以進行轉置運算
a=[1 2;3 4],其值顯示如下

1
2
3
a =
1 2
3 4
1
2
3
4
5
6
% 以下為輸入指令
>> d=a'
% 以下為輸出結果
d =
1 3
2 4

矩陣提值

如果我們想要提取矩陣中的特定數值,可以以下列方式進行
a=[1:3;4:6],其值顯示如下

1
2
3
a =
1 2 3
4 5 6

於變數後面加圓括號,在圓括號中就可以指定想要提取矩陣位置的數值 (稱為序數),e.g. b=a(2,3),範例如下

1
2
3
4
5
% 以下為輸入指令
>> b=a(2,3) % 代表將矩陣 a 的第二列第三行的數值賦給予 b
% 以下為輸出結果
b =
6

也可以直接提取矩陣 a 的特定值,e.g. a(2,3)

1
2
3
4
5
% 以下為輸入指令
>> a(2,3) % 顯示矩陣 a 的第二列第三行的數值
% 以下為輸出結果
ans =
6

提取特定位置特定數量的值,e.g. a(2,1:2)

1
2
3
4
5
% 以下為輸入指令
>> a(2,1:2) % 提出第二列第一到第二元素的數值
% 以下為輸出結果
ans =
4 5

修改矩陣部分數值方法

a=[1:3;4:6],其值顯示如下

1
2
3
a =
1 2 3
4 5 6

可以指定替換矩陣特定位置的值,e.g. 將矩陣 a 第一列第二行的值替換為 1,其值顯示如下

1
2
3
4
5
6
% 以下為輸入指令
>> a(1,2)=1
% 以下為輸出結果
a =
1 1 3
4 5 6

也可以新增特定位置的值,e.g 在第二列第八行新增一個值為 10,其值顯示如下

1
2
3
4
5
6
7
% 以下為輸入指令
>> a(2,8)=10
% 以下為輸出結果
a =
1 2 3 0 0 0 0 0
4 5 6 0 0 0 0 10
% 空缺區域會以 0 補足

另外也可以在原矩陣新增一列 (行) 陣列

1
2
3
4
5
6
7
% 以下為輸入指令
>> a = [a;1 3 5]
% 以下為輸出結果
a =
1 2 3
4 5 6
1 3 5

如果想要刪去特定值可以以 [] 做為空集合刪除

1
2
3
4
5
% 以下為輸入指令
>> a(2) =[]
% 以下為輸出結果
a =
1 2 5 3 6 % 刪除了第二列第一行的數,這個數是排列第二個的元素

想要刪除特定行或列,可以以:做為特定的「整行」或「整列」做刪除,其中這裡的:代表全部

1
2
3
4
5
6
% 以下為輸入指令
>> a(:,2) = [] % 刪除第二行全部數值
% 以下為輸出結果
a =
1 3
4 6

如欲將多個元素進行替換,可輸入指令 a([1 2],[1 2])=[1 2;3 4],其值會更改如下

1
2
3
4
5
6
% 以下為輸入指令
>> a([1 2],[1 2])=[1 2;3 4]
% 以下為輸出結果
a =
1 2 3
3 4 6

Info

序數必須為自然數,且不能為零。

end 指令

a=[1:3;4:6;7:9]

1
2
3
4
a =
1 2 3
4 5 6
7 8 9

輸入指令 x = a(end,2),其中 end 表示終點,這句指令描述取得第二行最後一列的數

1
2
3
4
5
% 以下為輸入指令
>> a(end,2)
% 以下為輸出結果
ans =
8

輸入指令 a(1:end,1) ,其中 end 表示終點,範例如下

1
2
3
4
5
6
7
% 以下為輸入指令
>> a(1:end,1) % (第一列:最後一列,第一行),這句指令描述取第一行的第一列到最後一列所有值
% 以下為輸出結果
ans =
1
4
7
1
2
3
4
5
6
7
% 另一個範例
% 以下為輸入指令
>> a(2:end,1) % (第二列:最後一列,第一行),這句指令描述取第一行的第二列到最後一列所有值
% 以下為輸出結果
ans =
4
7

如單純需要取某一行所有的值,其指令可簡寫如下,這裡的冒號:代表從頭到尾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% 以下為輸入指令
>> a(:,3) % 取得第三行所有數
% 以下為輸出結果
ans =
3
6
9

% 以下為輸入指令
>> a(:,2:3) % 取得最後二行所有參數可輸入
% 以下為輸出結果
ans =
2 3
5 6
8 9

另外算術運算可與 end 結合使用

1
2
3
4
5
% 以下為輸入指令
>>> a(end-1,2) % 取第二行最後一列再減一列的數
% 以下為輸出結果
ans =
5

分塊矩陣

分塊矩陣可以將兩個矩陣擺放在一起形成一個矩陣
a=[1:3;4:6;7:9]

1
2
3
4
a =
1 2 3
4 5 6
7 8 9

輸入指令 b=[a a]

1
2
3
4
5
6
7
% 以下為輸入指令
>> b=[a a]
% 以下為輸出結果
b =
1 2 3 1 2 3
4 5 6 4 5 6
7 8 9 7 8 9

::這種計算法方式需滿足矩陣行列數要求::

以下為錯誤範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
% 以下為輸入指令
>> a=[1 1]
% 以下為輸出結果
a =
1 1

% 以下為輸入指令
>> b=[1;1]
% 以下為輸出結果
b =
1
1

% 以下為輸入指令
>> c=[a b]
% 以下為輸出結果
Error using horzcat
Dimensions of arrays being concatenated are not consistent.
% 這個錯誤是因為此時 a 與 b 的行列數無法相符擺放在一起

符號矩陣

在進行符號運算之前,我們可用 syms 指令來定義符號變數

1
2
3
4
5
6
7
% 以下為輸入指令
>> syms a11 a12 a21 a22 % 定義符號變數,符號變數會輸出在視窗右方的 Workspace
>> a=[a11 a12;a21 a22]
% 以下為輸出結果
a =
[ a11, a12]
[ a21, a22]

Workspace 會顯示

這代表我們獲得了一個符號矩陣 a