【矩陣計算】矩陣乘法其一:基礎符號和算法


矩陣符號

矩陣操作

向量符號

向量操作

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):

歡迎關注微信公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM