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

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

顺便提一下这种复杂度低于定义式求逆的方法,来自于我的高等代数书,思想就是对分块矩阵(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. JPA扩展(自定义sql)

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  2. 在oracle表中增加、修改、删除字段,表的重命名,字段顺序调整

    增加字段语法:alter table tablename add (column datatype [default value][null/not null],….); 说明:alter table ...

  3. CAS 5.x搭建常见问题系列(3).Failure to find org.apereo.cas:cas-server-support-pm-jdbc:jar:5.1.9

    错误内容 cas overlay的pom.xml增加了cas-server-support-pm-jdbc.jary依赖后, 打包(mvn package)出现如下的报错 D:\casoverlay\ ...

  4. 通用http状态码

    400:Bad Request 表示客户端发出的请求不支持或无法识别,这通常是并未使用正确的请求语法.例如post或者put请求中资源的某个字段被设置为空的话,这将会导致一个Bad Request响应 ...

  5. ElasticSearch做实时OLAP框架~实时搜索、统计和OLAP需求,甚至可以作为NOSQL来使用(转)

    使用ElasticSearch作为大数据平台的实时OLAP框架 – lxw的大数据田地 http://lxw1234.com/archives/2015/12/588.htm 一直想找一个用于大数据平 ...

  6. js入门之函数

    一. 函数 函数可以封装一段特定功能的代码,然后通过函数名可以重复调用 1 .函数的定义 funcation 函数名 (){ 函数体 } 函数名() 调用函数 2. 函数的参数 funcation f ...

  7. c#排序sql语句查询

    排序存储的效果图: 根据id排序的sql存储过程: DECLARE @type varchar() ' ' Order By charindex(','+ convert(varchar,id) +' ...

  8. ASE19团队项目beta阶段Backend组 scrum8 记录

    本次会议于12月17日,19:30在微软北京西二号楼sky garden召开,持续10分钟. 与会人员:Hao Wang, Lihao Ran, Xin Kang, Zhikai Chen 每个人的工 ...

  9. Computer Vision_33_SIFT:Evaluation of Interest Point Detectors——2000

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  10. 单元测试自动生成工具evosuite

    github地址:https://github.com/EvoSuite/evosuite 官网地址:http://www.evosuite.org   快速开始: 1.  junit  <de ...