zoukankan      html  css  js  c++  java
  • 矩阵乘法及应用(矩阵快速幂)

    有关矩阵的深度学习,可见工程数学线性代数 。这里只简单说明一下,所谓矩阵,可看做把一堆数按一定规律写在一起的集合。

    矩阵乘法:

    对于一个n行q列的矩阵A和一个q行m列的矩阵B,A*B=C,C是一个n行m列的矩阵,且结果矩阵C第i行与第j列交叉位置的那个值,等于第一个矩阵A第i行与第二个矩阵B第j列,对应位置的每个值的乘积之和,即:Cij =Σaik*bkj(1<=i<=n,1<=j<=m,1<=k<=q)。有定义得,若矩阵A、B做A*B的乘法,则A的列数必须等于B的行数。且若A*B=C成立, B*A=C不一定成立,即:

        矩阵乘法不满足交换律,但满足结合律。

    代码:

    const int N=100;  
    int c[N][N];  //c是最终的矩阵
    void multi(int a[][N],int b[][N],int n)  
    {  
        memset(c,0,sizeof c);  
        for(int i=1;i<=n;i++)  
            for(int j=1;j<=n;j++)  
              for(int k=1;k<=n;k++)  
                c[i][j]+=a[i][k]*b[k][j];  
    } 

    若调整一下for的ijk顺序,调为ikj,实际运行效率会比上文代码快3倍左右,这里涉及到计算机原理的一些知识。

    优化代码:

    const int N=100;  
    int c[N][N];  //c是最终的矩阵
    void multi(int a[][N],int b[][N],int n)  
    {  
        memset(c,0,sizeof c);  
        for(int i=1;i<=n;i++)  
            for(int k=1;k<=n;k++)  
                for(int j=1;j<=n;j++)  
                c[i][j]+=a[i][k]*b[k][j];  
    }     

    简单来说,计算机里有一种叫高速缓存的东西,调用高速缓存中元素的时间花销远小于向内存查询元素,调用数组元素[i][j]时,它会把紧挨该数组元素之后的一些元素[i][j+1]...[i][j+k]放入高速缓存里,若下一个调用的数组元素正好在缓存里,则时间花销会很小;否则会花费更多的时间去在内存中寻找要调用的元素。简而言之,为了优化效率,对数组元素进行遍历时尽量按顺序遍历。整体越有序,时间效率就越高。

    再说明为什么可以调整ijk的顺序。c[i][j]的结果实际上是所有a[i][k]*b[k][j]结果的积累值。不管ijk的顺序如何,都会将三元组(i,j,k)(1<=i<=n,1<=j<=m,1<=k<=q)都遍历一遍,即所有a[i][k]*b[k][j]的计算都被且只被计算了一次,那么最终的积累值就不会改变,故ijk的顺序不会影响答案的正确性。

    矩阵快速幂:

      数的快速幂可将O(n)的计算次数降低到O(logn)的规模,单次矩阵乘法的计算复杂度为O(n^3) n为矩阵大小规模。对于一个大小规模为n的矩阵求它的k次幂,暴力计算复杂度为O(n^3 k)。运用快速幂的知识,将矩阵作为快速幂的底数,可将复杂度降到O( n^3 log k)。代码方面只需在快速幂代码的基础上重载一下运算符就好。

    应用:

      矩阵快速幂加速递推:

        见矩阵快速幂和矩阵乘法

        矩阵乘法和方程组之间的转化关系。

        对于一个有限的一次线性递推式,总可以写成矩阵的形式。最坏的情况下,也能写成主矩阵(要进行快速幂的矩阵)的第一行分别为递推式中,矩阵的列数对应的项的系数,其余行分别为主矩阵行对应的项所对应列为1、其余列为0;副矩阵为n行1列,分别将项按顺序写下的矩阵;结果矩阵就为副矩阵每项的下标统一加一个数(该数就为主矩阵的幂数)的矩阵  的情况。

  • 相关阅读:
    C# Apache Thrift Demo
    C#指针使用demo
    C#中指针使用总结
    fastjson之JSONObject、JSONArray
    fastjson使用
    ObjectMapper使用
    ObjectMapper将json转对象报错处理
    rabbitmq-channel方法介绍
    rabbitmq不同模式的交换机使用
    activemq总结
  • 原文地址:https://www.cnblogs.com/InductiveSorting-QYF/p/14324246.html
Copyright © 2011-2022 走看看