以下是可以加减乘除(就是乘逆矩阵啦)以及求若干次幂、行列式和逆的矩阵模板。

欢迎大家指正其中可能存在的错误(只验证了求逆的正确性)。

顺便提一下这种复杂度低于定义式求逆的方法,来自于我的高等代数书,思想就是对分块矩阵(A E)进行行变换从而得到(E A^-1),复杂度与消元一样,都是 O(N^3)的。

const int N=405,ha=1e9+7;

inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;}
inline void ADD(int &x,int y){ x+=y; if(x>=ha) x-=ha;} inline int ksm(int x,int y){
int an=1;
for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
return an;
}
inline int Get_inv(int x){ return ksm(x,ha-2);} struct matrix{
int a[N][N],n; inline void clear(){ memset(a,0,sizeof(a));}
inline void Base(){ clear(); for(int i=1;i<=n;i++) a[i][i]=1;} inline void input(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) scanf("%d",a[i]+j);
}
inline void output(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) printf("%d ",a[i][j]);
puts("");
}
} inline void swap(int x,int y){
for(int i=1;i<=n;i++) swap(a[x][i],a[y][i]);
}
inline void add(int from,int tmp,int to){
for(int i=1;i<=n;i++) ADD(a[to][i],a[from][i]*(ll)tmp%ha);
}
inline void mul(int x,int ml){
for(int i=1;i<=n;i++) a[x][i]=a[x][i]*(ll)ml%ha;
} inline int Determinant(){
int an=1;
matrix b=*this; for(int i=1,o,inv;i<=n;i++){
for(o=i;o<=n;o++) if(b.a[o][i]) break;
if(o>n) return 0;
if(o>i){ an=ha-an; b.swap(o,i);} inv=Get_inv(b.a[i][i]);
for(int j=i+1,tmp;j<=n;j++) if(b.a[j][i])
tmp=ha-inv*(ll)b.a[j][i]%ha,b.add(i,tmp,j); an=an*(ll)b.a[i][i]%ha;
} return an;
} inline matrix ni(){
matrix b; b.n=n,b.Base(); if(!Determinant()) b.clear();
else{ //先化成对角线元素都是1的上三角矩阵 for(int i=1,o,inv;i<=n;i++){
for(o=i;o<=n;o++) if(a[o][i]) break;
if(o>i) swap(o,i),b.swap(o,i); inv=Get_inv(a[i][i]),mul(i,inv),b.mul(i,inv); for(int j=i+1,tmp;j<=n;j++) if(a[j][i])
tmp=ha-a[j][i],add(i,tmp,j),b.add(i,tmp,j);
} //然后再把A消成单位矩阵 for(int i=n-1;i;i--)
for(int j=i+1;j<=n;j++) if(a[i][j]) b.add(j,ha-a[i][j],i),add(j,ha-a[i][j],i);
} return b;
} matrix operator +(const matrix &u){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) ADD(a[i][j],u.a[i][j]);
return *this;
} matrix operator -(const matrix &u){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) ADD(a[i][j],ha-u.a[i][j]);
return *this;
} matrix operator *(const matrix &u)const{
matrix r; r.clear(),r.n=n;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) ADD(r.a[i][j],a[i][k]*(ll)u.a[k][j]%ha);
return r;
} matrix operator /(matrix &u)const{
return *this*u.ni();
} matrix operator ^(int &u){
matrix b,c=*this; b.n=n,b.Base();
for(;u;u>>=1,c=c*c) if(u&1) b=b*c;
return b;
}
}JHY;

  

Public model for matrix的更多相关文章

  1. Android笔记——Matrix

    转自:http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html#translate Matrix的数学原理 在Android中,如果你 ...

  2. [Web API] Web API 2 深入系列(6) Model绑定(上)

    目录 解决什么问题 Model元数据解析 复杂类型 ValueProvider ValueProviderFactory 解决什么问题 Model: Action方法上的参数 Model绑定: 对Ac ...

  3. Android中图像变换Matrix的原理、代码验证和应用(二)

    第二部分 代码验证 在第一部分中讲到的各种图像变换的验证代码如下,一共列出了10种情况.如果要验证其中的某一种情况,只需将相应的代码反注释即可.试验中用到的图片: 其尺寸为162 x 251. 每种变 ...

  4. Android Matrix

    转自 :http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html#code Matrix的数学原理 平移变换 旋转变换 缩放变换 错切 ...

  5. UNITY_MATRIX_IT_MV[Matrix] (转载)

    转载 http://blog.csdn.net/cubesky/article/details/38682975 前面发了一篇关于unity Matrix的文章. http://blog.csdn.n ...

  6. Android源码之Matrix

    Matrix类在Android中主要用来进行矩阵变换,其可操作的对象包括图像.点阵.Vector(向量).矩形等. Matrix支持的变换类型主要有以下几种: 1.Translate:平移变换 2.R ...

  7. android.graphics.Matrix

    Matrix类包含了一个3x3的矩阵用来改变坐标,它没有一个构造器来初始化它里边的内容,所以创建实例后需要调用reset()方法生成一个标准matrix,或者调用set..一类的函数,比如setTra ...

  8. Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix

    MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...

  9. Android Matrix详解

    Matrix的数学原理 平移变换 旋转变换 缩放变换 错切变换 对称变换 代码验证 Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.An ...

随机推荐

  1. PHP对程序员的要求更高

     我这个文章标题可不是和大家开玩笑的哦  首先, 大家都知道, PHP也是一种编译型脚本语言, 和其他的预编译型语言不同, 它不是编译成中间代码, 然后发布.. 而是每次运行都需要编译.. 为此, 也 ...

  2. 帝国cms“建立目录不成功,请检查目录权限”的解决方法

    就这个看似简单的问题我折腾了两天,百度看产生这个问题的原因有很多也很宽泛,大部分说的是初始化内置数据,但我出现“建立目录不成功,请检查目录权限”的原因估计只有少部分人会遇到. 内置初始化数据是你上传文 ...

  3. QT实现两条贪吃蛇

    Snake.pro文件 1 #------------------------------------------------- 2 # 3 # Project created by QtCreato ...

  4. XXX银行人事管理系统-数据库设计

    1. 用户.权限.角色关系用户基本信息 userinfo [人员表]权限表actions[权限表]员工类型表usertype [管理组表]权限映射表actionmapping [权限映射表]权限分栏表 ...

  5. 同步/异步/阻塞/非阻塞/BIO/NIO/AIO

    转摘自:https://www.cnblogs.com/lixinjie/p/a-post-about-io-clearly.html 常规的误区 假设有一个展示用户详情的需求,分两步,先调用一个HT ...

  6. mybatis查询foreach使用

    1.mybatis传入map参数,map中包含list: List<FukaModel> fukaModels = price.getSchemaPrice().getFukaList() ...

  7. VBA算术运算符

    以下是VBA支持算术运算符. 假设变量A=5,变量B=10,那么 - 运算符 描述 示例 + 两个操作数相加 A + B = 15 - 两个操作数相减 A - B = -5 * 两个操作数相乘 A * ...

  8. 前端html转pdf

    转 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...

  9. /Android/sdk/build-tools/21.1.2/aapt'' finished with non-zero exit value 42

    相信很多朋友都会遇到 Error:Error: com.android.ide.common.process.ProcessException: org.gradle.process.internal ...

  10. iOS登录及token的业务逻辑

    登录的业务逻辑 { http:是短连接. 服务器如何判断当前用户是否登录? // 1. 如果是即时通信类:长连接. // 如何保证服务器跟客户端保持长连接状态? // "心跳包" ...