zoukankan      html  css  js  c++  java
  • 矩阵快速幂

    清北学堂听了李昊老师讲的矩阵快速幂,觉得挺有收获,整理一下下~

    主要用到的知识就是矩阵乘法和重载运算符~

    首先说一下矩阵乘法的定义:

    那么我们就可以看到,这个矩阵乘法不是像一般的代数式一样相乘,而是有自己的规则:

    答案矩阵C第i行第j列的值为: A矩阵的第i行每个元素乘上对应B矩阵第j列的每个元素的和,也就是上面那个公式(前提要保证A矩阵的列数等于B矩阵的行数,否则答案为0)

    那么怎么办呢??

    我们可以自己来重编一下乘法运算,使其变为矩阵的乘法运算,这就是重载运算符,很好理解吧!(当然你也可以写一个函数来算矩阵乘法)

    先说一下重载运算符的代码吧:

    下面给出自定义函数的代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int mod=1000000007,n,k;       //膜数mod根据具体情况而定
    struct matrix{                          //定义结构体
    long long data[101][101];       //用来存放矩阵元素
    matrix()
    {
    for(int i=0;i<=n;i++)
    for(int j=0;j<=n;j++)
    data[i][j]=0;                             //初始化
    }
    };
    matrix a,c,e;                           //创建多组结构体
    matrix cheng(matrix a,matrix b)        //核心代码,自定义矩阵乘法规则
    {
    matrix c;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    for(int m=1;m<=n;m++)
    c.data[i][j]+=a.data[i][m]*b.data[m][j]%mod;      //根据矩阵乘法定义进行运算,卡定义呗,各位大佬应该都会
    return c;
    }
    matrix quick_pow(matrix x,int y)                     //快速幂,主要前面是matrix,被卡了好几次才发现是这个问题

    matrix ans=e;
    while(y)
    {
    if(y&1) ans=cheng(ans,x);                               //自定义运算
    x=cheng(x,x); 
    y>>=1;
    }
    return ans;
    }
    int main()
    {
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    e.data[i][i]=1;                                                     //单位矩阵,不能没有!!!相等于快速幂中的ans=1
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    cin>>a.data[i][j];
    matrix ans=quick_pow(a,k);
    for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=n;j++)
    cout<<ans.data[i][j]<<" ";
    cout<<endl;
    }
    return 0;
    }

  • 相关阅读:
    docker与虚拟机性能比较
    CAP原则(CAP定理)、BASE理论
    CAP 定理的含义
    JVM监测分析JConsole
    JConsole详解
    jconsole工具使用
    轻松看懂Java字节码
    JVM 虚拟机字节码指令表
    深入理解java虚拟机(六)字节码指令简介
    大话+图说:Java字节码指令——只为让你懂
  • 原文地址:https://www.cnblogs.com/xcg123/p/10673632.html
Copyright © 2011-2022 走看看