matrix矩阵求逆 与解方程模板 留做备用 (有bug,待补充)
//
// main.cpp
// 矩阵求逆
//
// Created by 唐 锐 on 13-6-20.
// Copyright (c) 2013年 唐 锐. All rights reserved.
// #include<iostream>
#include<algorithm>
#include<iomanip>
#include<string>
#include<sstream>
#include<cmath>
#include<vector>
using namespace std;
namespace MATRIX {
const double eps = 1e-;
template<typename T>
class matrix
{
vector<vector<T>>m;
int check()
{
if(m.empty())return ;
for(int i=;i<m.size();i++)
if(m[i].size()!=m[].size())
return ;
return ;
};
matrix wrong()
{
matrix mat;
mat.m.clear();
vector<T>vec(,-);
mat.m.push_back(vec);
return mat;
}
public:
T at(int i,int j)
{
return m[i][j];
}
vector<T>& operator [](const int i) const
{
return m[i];
}
int size()
{
return m.size();
}
istream &input(istream& in)
{
do {
m.clear();
string s;
while(getline(in,s))
{
if(s=="")break;
istringstream temp(s);
T t;
vector<T> v ;
while(temp>>t)
v.push_back(t);
m.push_back(v);
}
} while(!check());
return in;
}
ostream &output(ostream& out) const
{
for(int i=;i<m.size();i++)
{
for(int j=;j<m[i].size();j++)
{
out<<m[i][j]<<' ';
}
out<<endl;
}
return out;
}
friend inline istream& operator>>(istream& in,matrix& m)
{
return m.input(in);
}
friend inline ostream& operator<<(ostream& out,const matrix& m)
{
return m.output(out);
}
void eye(int n,int k=-)
{
if(k==-)k=n;
m.clear();
vector<T> vec(k,);
vector<vector<T>> mat(n,vec);
for(int i=;i<n&&i<k;i++) mat[i][i]=;
m=mat;
} matrix inv()
{
if(m.size()!=m[].size())return wrong();
matrix ans;
vector<vector<T>>cp=m;
ans.eye((int)m.size());
for(int i=;i<cp.size();i++)
{
if(fabs(cp[i][i])<eps)
for(int j=i+;j<cp.size();j++)
{
if(fabs(cp[j][i])>eps)
{
swap(cp[i],cp[j]);
break;
}
if(j==cp.size()-) return wrong();
}
for(int j=i+;j<cp.size();j++)
{
T k=cp[j][i]/cp[i][i];
for(int l=;l<cp[i].size();l++)
{
cp[j][l]-=k*cp[i][l];
ans.m[j][l]-=k*ans.m[i][l];
}
}
} for(int i=(int)cp.size()-;i>=;i--)
{
for(int j=i-;j>=;j--)
{
T k=cp[j][i]/cp[i][i]; for(int l=;l<cp[i].size();l++)
{
cp[j][l]-=k*cp[i][l];
ans.m[j][l]-=k*ans.m[i][l];
}
}
}
for(int i=;i<cp.size();i++)
for(int j=;j<cp[i].size();j++)
{
ans.m[i][j]/=cp[i][i];
}
return ans;
}
vector<T>solve(vector<T>v)
{
vector<T> wrong;
vector<int>turn;
for(int i=;i<v.size();i++)
turn.push_back(i);
if(m[].size()!=v.size())return wrong;
vector<T> ans(v.size(),);
vector<vector<T>>cp=m;
for(int i=;i<cp.size();i++)
{
if(fabs(cp[i][i])<eps)
for(int j=i+;j<cp.size();j++)
{
if(fabs(cp[j][i])>eps)
{
swap(cp[i],cp[j]);
swap(v[i],v[j]);
swap(turn[i],turn[j]);
break;
}
if(j==cp.size()-) return wrong;
}
for(int j=i+;j<cp.size();j++)
{
T k=cp[j][i]/cp[i][i];
for(int l=;l<cp[i].size();l++)
{
cp[j][l]-=k*cp[i][l];
}
v[j]-=k*v[i];
}
}
for(int i=(int)cp.size()-;i>=;i--)
{
for(int j=i-;j>=;j--)
{
T k=cp[j][i]/cp[i][i]; for(int l=;l<cp[i].size();l++)
{
cp[j][l]-=k*cp[i][l];
}
v[j]-=k*v[i];
}
}
for(int i=;i<v.size();i++)
{
ans[turn[i]]=v[i]/cp[i][i];
if(fabs(ans[turn[i]])<eps)
ans[turn[i]]=;
}
return ans;
} };
template <typename T>
ostream &operator<<(ostream& out,const vector<T>& v)
{
for(int i=;i<v.size();i++)
{
if(i)out<<' ';
out<<v[i];
}
return out;
} }
using namespace MATRIX;
int main()
{
matrix<double> m;
double t;
vector<double> v;
while(cin>>m)
{
for(int i=;i<m.size();i++)
{
cin>>t;
v.push_back(t);
}
vector<double>ans=m.solve(v);
cout<<ans<<endl;
}
} /* matrix 1 1 2 0 0
3 4 0 0
0 0 4 1
0 0 3 2 matrix 2 1 0 -1 2 1
3 2 -3 5 3
2 2 1 4 -2
0 4 3 3 1
1 0 8 -11 4 matrix 3 1 0 -1 2 1 0 2
1 2 -1 3 1 -1 4
2 2 1 6 2 1 6
-1 4 1 4 0 0 0
4 0 -1 21 9 9 9
2 4 4 12 5 6 11
7 -1 -4 22 7 8 18 matrix 4 4 2 -3 -1 2 1 0 0 0 0
8 6 -5 -3 6 5 0 1 0 0
4 2 -2 -1 3 2 -1 0 3 1
0 -2 1 5 -1 3 -1 1 9 4
-4 2 6 -1 6 7 -3 3 2 3
8 6 -8 5 7 17 2 6 -3 5
0 2 -1 3 -4 2 5 3 0 1
16 10 -11 -9 17 34 2 -1 2 2
4 6 2 -7 13 9 2 0 12 4
0 0 -1 8 -3 -24 -8 6 3 -1 vector 1 5 12 3 2 3 46 13 38 19 -21 */
matrix矩阵求逆 与解方程模板 留做备用 (有bug,待补充)的更多相关文章
- vijos P1915 解方程 加强版
背景 B酱为NOIP 2014出了一道有趣的题目, 可是在NOIP现场, B酱发现数据规模给错了, 他很伤心, 哭得很可怜..... 为了安慰可怜的B酱, vijos刻意挂出来了真实的题目! 描述 已 ...
- 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)
心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...
- 5.5Python数据处理篇之Sympy系列(五)---解方程
目录 目录 前言 (一)求解多元一次方程-solve() 1.说明: 2.源代码: 3.输出: (二)解线性方程组-linsolve() 1.说明: 2.源代码: 3.输出: (三)解非线性方程组-n ...
- Angular6 学习笔记——组件详解之模板语法
angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...
- [置顶] hdu 4418 高斯消元解方程求期望
题意: 一个人在一条线段来回走(遇到线段端点就转变方向),现在他从起点出发,并有一个初始方向, 每次都可以走1, 2, 3 ..... m步,都有对应着一个概率.问你他走到终点的概率 思路: 方向问 ...
- 【NOIP2014】解方程
题目描述 已知多项式方程 \[a_0 + a_1x + a_2x^2 + \dots +a_nx^n=0\] 求这个方程在\([1,m]\)内的整数解(\(n\)和\(m\)均为正整数). 输入输出格 ...
- 解方程 sqrt(x-sqrt(n))+sqrt(y)-sqrt(z)=0的所有自然数解
解方程 小象同学在初等教育时期遇到了一个复杂的数学题,题目是这样的: 给定自然数 nn,确定关于 x, y, zx,y,z 的不定方程 \displaystyle \sqrt{x - \sqrt{n} ...
- luogu2312 解方程 (数论,hash)
luogu2312 解方程 (数论,hash) 第一次外出学习讲过的题目,然后被讲课人的一番话惊呆了. 这个题,我想着当年全国只有十几个满分.....然后他又说了句我考场A这道题时,用了5个模数 确实 ...
- Sympy解方程-求极限-微分-积分-矩阵运算
简介 Sympy是一个Python的科学计算库,用一套强大的符号计算体系完成诸如多项式求值.求极限.解方程.求积分.微分方程.级数展开.矩阵运算等等计算问题.虽然Matlab的类似科学计算能力也很强大 ...
随机推荐
- linux内核--中断处理程序
一个设备的中断处理程序是它设备驱动程序的一部分--设备驱动程序是用于对设备进行管理的内核代码.中断处理程序与其他内核函数的真正区别在于,中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断 ...
- Tomcat: IllegalStateException: No output folder --reference
Today, I started to create a couple of JSP pages for the server-side part of my MSc thesis project i ...
- A+B问题(java)
import java.util.Scanner; public class Main { public static void main ( String args[] ) { Scanner in ...
- 富文本 SpannableString Span
经典使用场景 SpannableStringBuilder needStartSSB = new SpannableStringBuilder("需要"); SpannableSt ...
- WebBrowser控件使用相关
修改WebBrowser控件的内核解决方案 http://www.cnblogs.com/sung/p/3391264.html C#中的WebBrowser控件的使用 http://www.cnbl ...
- (转)server.urlencode有什么用?怎么用?
这个函数主要是为了,不同浏览器的事,如果你传递的参数是中文,有的浏览器就显示出错,如果转换成编码形式,就可以正确传递!当然在IE下2个结果都是一样的,你看不出来区别,用编码来传递参数是一个好习惯,养成 ...
- Lesson 4: Know Your Tools
Lesson 4: Know Your Tools "差劲的人
- iOS中如何使状态栏与下面的搜索栏或NavigationBar或toolBar颜色一致
在iOS7之后,status bar是透明的(transparent),navigation bars,tab bars,toolbars,search bars 和 scope bars 是半透明的 ...
- iOS9中请求出现App Transport Security has blocked a cleartext HTTP (http://)
错误描述: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecu ...
- POP动画引擎中Layer与CALayer的一点区别
POP动画引擎是facebook提供的一个开源框架, 可以实现很多的动画效果, 这里就不一一介绍啦, 有兴趣的童鞋请移步: https://github.com/facebook/pop 下面简单的讲 ...