矩陣符號
矩陣操作
向量符號
向量操作
Saxpy算法
Gaxpy算法
外積
矩陣分割和冒號符號
矩陣-矩陣乘法
復數矩陣
矩陣符號
如果用
表示所有實數的集合,那么我們用
表示所有
的實數矩陣組成的向量空間,即:
其中,大寫字母(如
)表示矩陣,帶下標的小寫字母(如
)表示矩陣中的元素。除了用
表示矩陣
中第
行第
列的元素之外,也可以用
和
表示。
矩陣操作
矩陣轉置(transposition):
矩陣加法(addition):
標量-矩陣乘法(scalar-matrix multiplication):
矩陣-矩陣乘法(matrix-matrix multiplication):
矩陣點乘(pointwise multiplication):
矩陣點除(pointwise division):
注意,要使矩陣點除有意義,則分母矩陣中不能有值為0的元素。
向量符號
我們用
表示所有長度為
的實數向量組成的向量空間,即:
其中,粗體小寫字母(如
)表示向量,帶下標的小寫字母(如
)表示向量中的元素。除了用
表示向量
中第
個元素之外,也可以用
和
表示。
我們用
表示列向量,用
表示行向量,即:
向量操作
向量加法(vector addition):
標量-向量乘法(scalar-vector multiplication):
內積/點積(inner/dot product):
向量點乘(pointwise multiplication):
向量點除(pointwise division):
注意,要使向量點除有意義,則分母向量中不能有值為0的元素。
Saxpy算法
“Saxpy”是“scalar a x plus y”的助記符,表示用
的值更新
的值。Saxpy算法用公式表示為:
注意這里的“
”不是相等符號,而是賦值符號。
Gaxpy算法
如果把Saxpy算法中的標量換成矩陣,那么我們就能得到廣義(generalized)Saxpy算法,即Gaxpy算法:
其中,
,
並且
。
我們可以用兩層for循環實現Gaxpy算法:
for i=1:m
for j=1:n
y(i)=y(i)+A(i,j)x(j)
end
end
在這段代碼中,外層的for循環遍歷矩陣的每一行,內層的for循環遍歷矩陣的每一列,像這樣一行一行地遍歷矩陣的Gaxpy算法也稱為面向行的(row-oriented)Gaxpy算法。
當然,我們也可以一列一列地遍歷矩陣,這樣就有了面向列的(column-oriented)Gaxpy算法:
for j=1:n
for i=1:m
y(i)=y(i)+A(i,j)x(j)
end
end
外積
不同於向量
和
的內積
,向量
和
的外積
表示如下:
其中,
,
並且
。
和Gaxpy算法類似,外積也有面向行的外積:
for i=1:m
for j=1:n
A(i,j)=A(i,j)+x(i)y(j)
end
end
和面向列的外積:
for j=1:n
for i=1:m
A(i,j)=A(i,j)+x(i)y(j)
end
end
矩陣分割和冒號符號
一個
的矩陣可以看作是
個長度為
的行向量組成的:
同理,一個
的矩陣也可以看作是
個長度為
的列向量組成的:
我們可以用
表示矩陣
的第
個行向量(第
行):
也可以用
表示矩陣
的第
個列向量(第
列):
在此基礎上,我們可以重寫面向行的Gaxpy算法:
for i=1:m
y(i)=y(i)+A(i,:)x
end
可以看出,面向行的Gaxpy算法實際上是
個內積操作加
個標量加法操作。
我們接着重寫面向列的Gaxpy算法:
for j=1:n
y=y+x(j)A(:,j)
end
可以看出,面向列的Gaxpy算法實際上是
個標量-向量乘法操作加
個向量加法操作。
對於外積,我們先重寫面向行的外積:
for i=1:m
A(i,:)=A(i,:)+x(i)y
end
可以看出,面向行的外積實際上是
個標量-向量乘法操作加
個行向量加法操作。
我們接着重寫面向列的外積:
for j=1:n
A(:,j)=A(:,j)+y(j)x
end
可以看出,面向列的外積實際上是
個標量-向量乘法操作加
個列向量加法操作。
矩陣-矩陣乘法
我們把矩陣-矩陣乘法寫成用
更新
的形式,即:
其中,
,
並且
。
我們把矩陣-矩陣乘法用三層for循環展開得到:
for i=1:m
for j=1:n
for k=1:r
C(i,j)=C(i,j)+A(i,k)B(k,j)
end
end
end
可以看出,矩陣-矩陣乘法實際上是
個標量乘法操作加
個標量加法操作。
如果我們只展開外面兩層for循環,則有:
for i=1:m
for j=1:n
C(i,j)=C(i,j)+A(i,:)B(:,j)
end
end
可以看出,矩陣-矩陣乘法實際上是
個內積操作加
個標量加法操作。
如果我們只展開最外層的for循環,則有:
for i=1:m
C(i,:)=C(i,:)+A(i,:)B
end
可以看出,矩陣-矩陣乘法實際上是
個向量-矩陣乘法操作加
個向量加法操作。
雖然改變三層for循環的前后順序並不影響矩陣-矩陣乘法的結果,但是可以方便我們從不同角度理解矩陣-矩陣乘法。這里只列出了結果,具體過程可以參考上述方法。
| 循環 順序 |
兩層循環 | 一層循環 | 兩層循環對應的 數據訪問方式 |
|---|---|---|---|
| i j k | 內積 | 向量-矩陣乘法 | 從A取行,從B取列 |
| j i k | 內積 | 矩陣-向量乘法 | 從A取行,從B取列 |
| i k j | Saxpy | 面向行的Gaxpy | 從B取行,從C取行 |
| j k i | Saxpy | 面向列的Gaxpy | 從A取列,從C取列 |
| k i j | Saxpy | 面向行的外積 | 從B取行,從C取行 |
| k j i | Saxpy | 面向列的外積 | 從A取列,從C取列 |
復數矩陣
和實數相對的是復數,因此我們接下來介紹復數矩陣和復數向量。
我們用
表示所有復數組成的集合,用
表示所有
的復數矩陣構成的向量空間,並且用
表示所有長度為
的復數向量構成的向量空間。
如果矩陣
,那么我們用
和
分別表示矩陣A的實部和虛部,即:
,
。
雖然實數矩陣的大部分操作都適用於復數矩陣,但是也有一些操作不適用於復數矩陣。比如:
矩陣
的共軛(conjugate)矩陣
:
其中,兩個實部相等,虛部互為相反數的復數互為共軛復數(conjugate complex number)。
復數矩陣
的轉置(transposition)是共軛轉置:
兩個復數向量的內積(inner product):

