//
// 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,待补充)的更多相关文章

  1. vijos P1915 解方程 加强版

    背景 B酱为NOIP 2014出了一道有趣的题目, 可是在NOIP现场, B酱发现数据规模给错了, 他很伤心, 哭得很可怜..... 为了安慰可怜的B酱, vijos刻意挂出来了真实的题目! 描述 已 ...

  2. 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...

  3. 5.5Python数据处理篇之Sympy系列(五)---解方程

    目录 目录 前言 (一)求解多元一次方程-solve() 1.说明: 2.源代码: 3.输出: (二)解线性方程组-linsolve() 1.说明: 2.源代码: 3.输出: (三)解非线性方程组-n ...

  4. Angular6 学习笔记——组件详解之模板语法

    angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...

  5. [置顶] hdu 4418 高斯消元解方程求期望

    题意:  一个人在一条线段来回走(遇到线段端点就转变方向),现在他从起点出发,并有一个初始方向, 每次都可以走1, 2, 3 ..... m步,都有对应着一个概率.问你他走到终点的概率 思路: 方向问 ...

  6. 【NOIP2014】解方程

    题目描述 已知多项式方程 \[a_0 + a_1x + a_2x^2 + \dots +a_nx^n=0\] 求这个方程在\([1,m]\)内的整数解(\(n\)和\(m\)均为正整数). 输入输出格 ...

  7. 解方程 sqrt(x-sqrt(n))+sqrt(y)-sqrt(z)=0的所有自然数解

    解方程 小象同学在初等教育时期遇到了一个复杂的数学题,题目是这样的: 给定自然数 nn,确定关于 x, y, zx,y,z 的不定方程 \displaystyle \sqrt{x - \sqrt{n} ...

  8. luogu2312 解方程 (数论,hash)

    luogu2312 解方程 (数论,hash) 第一次外出学习讲过的题目,然后被讲课人的一番话惊呆了. 这个题,我想着当年全国只有十几个满分.....然后他又说了句我考场A这道题时,用了5个模数 确实 ...

  9. Sympy解方程-求极限-微分-积分-矩阵运算

    简介 Sympy是一个Python的科学计算库,用一套强大的符号计算体系完成诸如多项式求值.求极限.解方程.求积分.微分方程.级数展开.矩阵运算等等计算问题.虽然Matlab的类似科学计算能力也很强大 ...

随机推荐

  1. Cobar是提供关系型数据库(MySQL)分布式服务的中间件

    简介 Cobar是提供关系型数据库(MySQL)分布式服务的中间件,它可以让传统的数据库得到良好的线性扩展,并看上去还是一个数据库,对应用保持透明. 产品在阿里巴巴稳定运行3年以上. 接管了3000+ ...

  2. [Javascript] Advanced Reduce: Additional Reducer Arguments

    Sometimes we need to turn arrays into new values in ways that can't be done purely by passing an acc ...

  3. 01标题背包水章 HDU2955——Robberies

    原来是dp[i],它代表的不被抓的概率i这最大的钱抢(可能1-100) 客是dp[i]表示抢了i钱最大的不被抓概率,嗯~,弱菜水题都刷不动. 那么状态转移方程就是 dp[i]=max(dp[i],dp ...

  4. Array.asList:数组转list时你一定要知道的“陷阱”!

    最近开发中,业务上处理,经常用到asList方法,这让我不经想起了它的很多容易让人犯错的地方或者误解的地方,所以就想抽出时间来,整理一下,和大家分享出来,深夜了,话不多说,主要以代码为主,简易的代码, ...

  5. 通过yum升级CentOS/RHEL最小化安装

    1.如果你有安装CentOS / RHEL最小服务器安装,您可能有很多麻烦没有安装包 2.有一种方法来安装所有的包,需要一个基本的服务器,使用yum groupinstall命令 3.从最小的安装基本 ...

  6. Linux查看硬件信息以及驱动设备的命令

    用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart) 查看CPU信息:cat /proc/cpuinfo 查看板卡信息:cat /proc/pci 查 ...

  7. JQuery 代码

    http://baike.baidu.com/view/136475.htmhttp://www.cnblogs.com/gleamy_ming/archive/2009/04/29/1446492. ...

  8. Android Http请求失败解决方法

    1.MainActivity.java 文件中的onCreate方法改成如下: @SuppressLint("NewApi") @Override protected void o ...

  9. android:http下载文件并保存到本地或SD卡

    想把文件保存到SD卡中,一定要知道SD卡的路径,获取SD卡路径: Environment.getExternalStorageDirectory() 另外,在保存之前要判断SD卡是否已经安装好,并且可 ...

  10. 如何在CentOS 7上修改主机名

    如何在CentOS 7上修改主机名 在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵活的(pretty).“静态”主机名也称为内核主机名,是系统在启动时 ...