当前位置: 首页 > news >正文

矩阵运算

矩阵加、减法

矩阵加法非常简单,对应位置直接加减即可,但是前提是两个矩阵大小相同(即一个矩阵是N*M的,另一个与之相加的矩阵的大小也要是N*M)。就像这样:


矩阵乘法

矩阵乘法就相对比较复杂了。他需要满足的前提是第一个矩阵的列数要等于第二个矩阵的行数,这样的两个矩阵才可以相乘。下面我用一个图来解释怎么样进行矩阵乘法:

 

矩阵乘法性质:

       ①矩阵乘法满足乘法结合律————A*B*C=(A*B)*C=A*(B*C)

       ②矩阵乘法满足左分配律和右分配律————C*(A+B)=C*A+C*B || (A+B)*C=A*C+B*C

       ③矩阵乘法不满足交换律————A*B!=B*A

下面是矩阵乘法的代码:

#include<bits/stdc++.h>
using namespace std;
int m1[10][10],m2[10][10],m3[10][10];  //m1*m2=m3
int main(){
    register int a,b,c;
    //矩阵m1大小为n*m 矩阵m2大小为m*k 矩阵m3大小为n*k 
    for(a=1;a<=n;++a)
      for(b=1;b<=m;++b)
        for(c=1;c<=k;++c)
          m3[a][c]+=m1[a][b]*m2[b][c];
    return 0; 
}

 应用:矩阵乘法可以用来求斐波那契数列的第n项

用矩阵乘法求斐波那契数列的第n项,如果n比较的大的话就需要用到矩阵KSM了,不会的可以看一下这篇博客:https://www.cnblogs.com/Glacier-elk/p/9489655.html

洛谷原题链接:https://www.luogu.org/problemnew/show/P1962

在这道题目中保证n在long long的范围内,这就需要用到矩阵乘法和矩阵快速幂了。首先我们要知道怎么样用矩阵求斐波那契数列,也就是确定矩阵A和矩阵B分别是什么。其中一个矩阵肯定是存放斐波那契数列的,我们不妨就让矩阵A是斐波那契数列,让矩阵A是一个1*2的矩阵,分别存放第n项和第n-1项,则矩阵A可以表示为

 

。那矩阵B就需要使A*B可以得到斐波那契的下一项。首先我们可以确定的是,矩阵B是一个2*2的矩阵,因为矩阵乘法需要满足一个矩阵的列数等于另一个矩阵的行数。所以我们不妨设矩阵B为,那么这样的话C就可以表示为,因为C也可以表示为,我们就可以用斐波那契数列的前几项列出几个方程组,就可以求出矩阵B的元素了。通过计算,我们发现矩阵B为。我们还可以发现,矩阵A每乘一次矩阵B,数列就可以向前递进一项,所以我们求第n项,就需要用矩阵A乘n-2遍矩阵B,也就是矩阵A乘矩阵B的n-2次方,这样我们就可以用矩阵快速幂求解。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll n,b[3][3],a[2][2],ans[3][3]={0,0,0,0,1,1,0,1,1},c[3][3];
void mul(int x){
    register int i,j,k;
    memset(c,0,sizeof(c));
    for(i=1;i<=2;++i)
      for(j=1;j<=2;++j)
        for(k=1;k<=2;++k)
            if(x) c[i][k]+=ans[i][j]*b[j][k],c[i][k]%=mod;
              else c[i][k]+=b[i][j]*b[j][k],c[i][k]%=mod;
    for(i=1;i<=2;++i)
      for(j=1;j<=2;++j)
        if(x) ans[i][j]=c[i][j];
        else b[i][j]=c[i][j];
}
void ksm(ll cur){
    while(cur){
        if(cur & 1) mul(1);
        cur>>=1;
        mul(0);
    }
    printf("%lld",ans[1][1]%mod);
}
int main(){
    ios::sync_with_stdio(false);
    cin>>n;
    if(n<=2){
        cout<<"1";
        return 0;
    }
    ans[1][1]=1,ans[1][2]=1,b[1][1]=1,b[1][2]=1,b[2][1]=1,b[2][2]=0;
    ksm(n-2);
    return 0;
}

转载于:https://www.cnblogs.com/Glacier-elk/p/9747332.html

相关文章:

  • MySQL之架构与历史(一)
  • 函数指针
  • Django admin源码剖析
  • 第53节:Java当中的IO流(上)
  • linux下自动获取并安装软件包 apt-get 的命令介绍
  • [CF482B]Interesting Array
  • linux连接oracle数据
  • [微信小程序] 微信小程序下拉滚动选择器picker绑定数据的两种方式
  • bzoj3991 LCA + set
  • php面相对象基本概念,基本形式,传值
  • 【Linux】- ps 命令
  • 10-序列化
  • EM算法
  • 《弹球学成语》需求分析报告
  • IDEA控制台问题:java lang OutOfMemoryError:PermGen space
  • 08.Android之View事件问题
  • css的样式优先级
  • java8-模拟hadoop
  • leetcode46 Permutation 排列组合
  • maven工程打包jar以及java jar命令的classpath使用
  • quasar-framework cnodejs社区
  • React中的“虫洞”——Context
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 开发基于以太坊智能合约的DApp
  • 数据科学 第 3 章 11 字符串处理
  • 用element的upload组件实现多图片上传和压缩
  • 优化 Vue 项目编译文件大小
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 源码安装memcached和php memcache扩展
  • Java性能优化之JVM GC(垃圾回收机制)
  • Prometheus VS InfluxDB
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​虚拟化系列介绍(十)
  • #mysql 8.0 踩坑日记
  • (09)Hive——CTE 公共表达式
  • (1)(1.13) SiK无线电高级配置(六)
  • (Forward) Music Player: From UI Proposal to Code
  • (HAL库版)freeRTOS移植STMF103
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (十) 初识 Docker file
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET Core 版本不支持的问题
  • .NET Core引入性能分析引导优化
  • .Net Winform开发笔记(一)
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • @NestedConfigurationProperty 注解用法
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [20160902]rm -rf的惨案.txt