zoukankan      html  css  js  c++  java
  • 【矩阵计算】矩阵乘法其一:基础符号和算法

    矩阵符号

    矩阵操作

    向量符号

    向量操作

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

    欢迎关注微信公众号
  • 相关阅读:
    开始使用ACE工作
    I AM NOTHING vs I AM SOMETHING
    After you have run the GIS Server Post Install
    李开复的勇气论
    爱到底是什么?
    办公室交际不能碰触的“地雷”
    近日比较忙顾不上写随笔了
    什么是爱情?什么是婚姻?
    给自己科普一下SOA、AOP、ORM
    成功者需要具备的素质
  • 原文地址:https://www.cnblogs.com/jzyhywxz/p/9690562.html
Copyright © 2011-2022 走看看