Public model for matrix
以下是可以加减乘除(就是乘逆矩阵啦)以及求若干次幂、行列式和逆的矩阵模板。
欢迎大家指正其中可能存在的错误(只验证了求逆的正确性)。
顺便提一下这种复杂度低于定义式求逆的方法,来自于我的高等代数书,思想就是对分块矩阵(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的更多相关文章
- Android笔记——Matrix
转自:http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html#translate Matrix的数学原理 在Android中,如果你 ...
- [Web API] Web API 2 深入系列(6) Model绑定(上)
目录 解决什么问题 Model元数据解析 复杂类型 ValueProvider ValueProviderFactory 解决什么问题 Model: Action方法上的参数 Model绑定: 对Ac ...
- Android中图像变换Matrix的原理、代码验证和应用(二)
第二部分 代码验证 在第一部分中讲到的各种图像变换的验证代码如下,一共列出了10种情况.如果要验证其中的某一种情况,只需将相应的代码反注释即可.试验中用到的图片: 其尺寸为162 x 251. 每种变 ...
- Android Matrix
转自 :http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html#code Matrix的数学原理 平移变换 旋转变换 缩放变换 错切 ...
- UNITY_MATRIX_IT_MV[Matrix] (转载)
转载 http://blog.csdn.net/cubesky/article/details/38682975 前面发了一篇关于unity Matrix的文章. http://blog.csdn.n ...
- Android源码之Matrix
Matrix类在Android中主要用来进行矩阵变换,其可操作的对象包括图像.点阵.Vector(向量).矩形等. Matrix支持的变换类型主要有以下几种: 1.Translate:平移变换 2.R ...
- android.graphics.Matrix
Matrix类包含了一个3x3的矩阵用来改变坐标,它没有一个构造器来初始化它里边的内容,所以创建实例后需要调用reset()方法生成一个标准matrix,或者调用set..一类的函数,比如setTra ...
- Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...
- Android Matrix详解
Matrix的数学原理 平移变换 旋转变换 缩放变换 错切变换 对称变换 代码验证 Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.An ...
随机推荐
- 如何在 arm 官网上找到合适的手册
http://infocenter.arm.com/help/advanced/help.jsp 在这里输入合适的版号即可 这样就可以不用去 CSDN 了 100000_0000_00_EN - AR ...
- Linux 编译kernel有关Kconfig文件详解
ref : https://blog.csdn.net/Ultraman_hs/article/details/52984929 Kconfig的格式 下面截取/drivers/net下的Kconfi ...
- 学界 | 华为诺亚方舟实验室提出新型元学习法 Meta-SGD ,在回归与分类任务中表现超群
学界 | 华为诺亚方舟实验室提出新型元学习法 Meta-SGD ,在回归与分类任务中表现超群 机器之心发表于机器之心订阅 499 广告关闭 11.11 智慧上云 云服务器企业新用户优先购,享双11同等 ...
- react以组件为中心的代码分割和懒加载
背景 随着项目越来越复杂,功能够越来越多,JS单个文件就会比较臃肿,js代码拆分显得必不可少. Js文件拆分主要分为按照路由进行js拆分.按照组件进行js拆分. 按照路由拆分:因为本项目请求路径得原因 ...
- C#委托和事件的使用示例
一.委托 使用委托时要先实例化,和类一样,使用new关键字产生委托的新实例,然后将一个或者多个与委托签名匹配的方法与委托实例关联.随后调用委托时,就会调用所有与委托实例关联的方法. 与委托关联可以是任 ...
- 根据xsd文件生成对应的C#类,然后创建对应的xml文件
首先用xsd文件生产对应的C#类,这个VS已经自带此工单,方法如下: 1. 打开交叉命令行工具 2. 输入如下指令 xsd d:\123.xsd /c /language:C# /outputdir: ...
- D盘Program Files 文件夹里文件不显示,没隐藏。怎么才能显示出来?
D盘里有两个一模一样的Program Files 文件夹,文件夹里文件不显示,没隐藏.怎么才能显示出来?新买不久的电脑,win8.1系统 点击开始---运行---输入“cmd”(没有引号)---在弹出 ...
- Java Web 深入分析(1)B/S架构概述
B/S结构即浏览器和服务器结构.它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构.在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实 ...
- java jdk1.8 API
里面有 中英文 jdk 1.8 API 还有 jdk1.6 和1.7 英文 API 链接:https://pan.baidu.com/s/1tchABVX7htJCaO3quENP1g提取码:y ...
- 基于【 Docker】三 || Docker的基本操作
一.Docker常用命令 1.搜索镜像:docker search 镜像名称 2.下载镜像:docker pull 镜像名称:版本号 3.查看镜像:docker images 4.删除镜像:docke ...