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

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

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

    今天来介绍一款Ubuntu下的截图工具,名叫Flameshot. 安装 Flameshot的安装很简单. 命令行安装 sudo apt-get install flameshot 一条命令搞定! 软件 ...

  2. dg环境连接ORA-00604,ORA-16000: database open for read-only access

    报错信息 根据客户提供的报错信息, ORA-: error occurred at recursive SQL level ORA-: database open for read-only acce ...

  3. (六)CXF之自定义拦截器

    一.需求分析 客户端在调用服务端的方法时,需要进行用户名和密码验证.此时分为: 客户端请求的时候,要发送用户名密码到服务端 服务端检验用户名密码. 二.案例 前提:本章案例是基于前一章节的例子进一步讲 ...

  4. Spring Boot 全局Exception处理

    一.代码如下 package com.zxguan; import org.springframework.web.bind.annotation.ControllerAdvice; import o ...

  5. jvm的内存区域介绍

    什么是jvm? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 ...

  6. IIs发布的项目无法打开问题

    1/查看一下ISAPI筛选器,是否存在2.0,4.0,若缺少东西,就从新安装一下iis,存在某些程序没有被勾选,一般是asp.net3.5,asp.net4.0

  7. 解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题

    问题描述:     在IE8及以下版本时,点击label标签无法自动触发checkbox的click事件,导致无法产生希望的效果. 原HTML代码: <div class="col-s ...

  8. 3.Java集合-HashSet实现原理及源码分析

    一.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持,它不保证set的迭代顺序很久不变.此类允许使用null元素 二.HashSet的实现: 对于Ha ...

  9. Image Processing and Analysis_8_Edge Detection:Local Scale Control for Edge Detection and Blur Estimation——1998

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  10. linux修改文件系统注册设备