矩阵计算矩阵乘法其一:基础符号和算法

Posted jzyhywxz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵计算矩阵乘法其一:基础符号和算法相关的知识,希望对你有一定的参考价值。

矩阵符号

矩阵操作

向量符号

向量操作

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):
技术分享图片

技术分享图片

欢迎关注微信公众号



















































































以上是关于矩阵计算矩阵乘法其一:基础符号和算法的主要内容,如果未能解决你的问题,请参考以下文章

矩阵计算矩阵乘法其一:基础符号和算法

1.1 基本算法和记号

一种计算矩阵乘法的快速算法

如何计算矩阵的乘法?

算法矩阵列乘法 | 动态规划

并行计算-稠密矩阵计算复习(待续--待补一块内容和Cannon,DNS,Fox算法)