第28章 矩阵运算
来源:互联网 发布:源码包安装php 编辑:程序博客网 时间:2024/05/16 07:01
这一章给出了求解线性方程组Ax=b(|A|!=0)和求矩阵的逆的伪代码,下面用c++实现。
线性方程组:
1: 先求出P,L,U,使得PA=LU成立
void LUPDecomposition(vector< vector<double> >& array,vector<int>& P){ int dimension=array.size(); P.resize(dimension); for(int i=0;i!=P.size();++i) P[i]=i; for(int k=0;k!=array.size();++k) { double maxAbsoluteValue=0; int rowLabel=k; for(int i=k;i!=array.size();++i) if(maxAbsoluteValue<abs(array[i][k])){ maxAbsoluteValue=abs(array[i][k]); rowLabel=i; } if(maxAbsoluteValue==0) throw runtime_error("singular matrix"); swap(P[k],P[rowLabel]); for(int i=0;i!=array.size();++i) swap(array[k][i],array[rowLabel][i]); for(int i=k+1;i!=array.size();++i) { array[i][k]=array[i][k]/array[k][k]; for(int j=k+1;j!=array.size();++j) array[i][j]=array[i][j]-array[i][k]*array[k][j]; } }}
2:然后再用获得的L, U, P去求解AX=b;
void LUPSolution(const vector< vector<double> >& array,const vector<int>& P,const vector<double>& b,vector<double>& solution){ int dimension=array.size(); vector<double> tmp(dimension); tmp[0]=b[P[0]]; for(int i=1;i!=dimension;++i) { double tmpSum=0; for(int j=0;j<=i-1;++j) tmpSum+=array[i][j]*tmp[j]; tmp[i]=b[P[i]]-tmpSum; } solution.resize(dimension); solution[dimension-1]=tmp[dimension-1]/array[dimension-1][dimension-1]; for(int i=dimension-2;i>=0;--i) { double tmpSum=0; for(int j=i+1;j<=dimension-1;++j) tmpSum+=array[i][j]*solution[j]; solution[i]=(tmp[i]-tmpSum)/array[i][i]; }}
void linearSystem(vector< vector<double> >& array,const vector<double>& b){ vector<int> P; LUPDecomposition(array,P); vector<double> solution; LUPSolution(array,P,b,solution); for(int i=0;i!=solution.size();++i) cout<<solution[i]<<" "; cout<<endl;}
求解矩阵的逆的代码:
void inverseMatrix(vector< vector<double> >& array){ vector<int> P; LUPDecomposition(array,P); int dimension=array.size(); vector< vector<double> > inverseMat; inverseMat.resize(dimension); for(int i=0;i!=inverseMat.size();++i) inverseMat[i].resize(dimension); vector<double> b; b.resize(dimension,0); b[0]=1; for(int i=0;i!=dimension;++i) { vector<double> solution; LUPSolution(array,P,b,solution); for(int j=0;j!=dimension;++j) inverseMat[j][i]=solution[j]; if(i<dimension-1) swap(b[i],b[i+1]); } for(int i=0;i!=inverseMat.size();++i) for(int j=0;j!=inverseMat[i].size();++j) cout<<inverseMat[i][j]<<" ";}
0 0
- 第28章 矩阵运算
- 第7章 矩阵
- 线性代数:第二章 矩阵及其运算:逆矩阵、分块矩阵
- 考研复习第三天-线性代数-矩阵运算
- 第14周 拓展练习(四)矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 第一次
- Lightoj1010——Knights in Chessboard(找规律)
- 我的第三次上机实验3-1之个人所得税计算器
- Intellij idea 快捷键(2)--生成常用代码
- android导致VFY(verifyerror)错误的一种情况
- 第28章 矩阵运算
- Eclipse安装PyDev
- 递推
- PHP数组和数组函数
- Android API Guides---App Manifest <manifest> <meta-data> <path-permission>
- hadoop深入研究:(三)——hdfs数据流 随机选节点
- JQuery 遍历对象(DOM,数组,JSON)方法
- Hadoop DataNode的读和写流程 选择datanode方法 机架感知
- 单链队列基本操作