C++ 求一个矩阵的逆矩阵(星星笔记)
2014-09-14 10:23
363 查看
输入矩阵要求为方阵(n×n)
原理:将一个矩阵经过初等行变换化为上三角矩阵一次来求矩阵的行列式,进行行变换求的。
运行结果如下:
1.
![](http://img.blog.csdn.net/20140917162203343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWFhfMTIzXzFfUko=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2.
原理:将一个矩阵经过初等行变换化为上三角矩阵一次来求矩阵的行列式,进行行变换求的。
#include<iostream> #include<iomanip> using namespace std; int const n=3; //确定矩阵的节数 /* 作者 星星笔记 */ int main() { void temp(double aa[],double bb[],int n); double fun(double array ); double a ,b [2*n],c ,det1,yinzhi; double bb; int i,j,kk=0,k,u; for(i=0;i<n;i++) //初始化一个辅助矩阵 for(j=0;j<2*n;j++) b[i][j]=0; //---------输入原始矩阵--------------- cout<<"请输入一个"<<n<<"节方阵"<<endl; for(i=0;i<n;i++) for(j=0;j<n;j++) cin>>a[i][j]; //把矩阵a复制给矩阵b for(i=0;i<n;i++) for(j=0;j<n;j++) b[i][j]=a[i][j]; for(j=0;j<n;j++) b[j][n+j]=1; //------------------------------------ //------------测试查看---------- /* cout<<"a所对应的at矩阵b为:"<<endl; for(i=0;i<n;i++) for(j=0;j<2*n;j++) { cout<<setw(6)<<b[i][j]; kk=kk+1; if(kk%(2*n)==0) cout<<endl; } */ //---------------------------------- // det1=fun(a);//获取行列式的值 for(i=0;i<n;i++) { // b[i][i] 等于 0 的情况 if(b[i][i]==0) for(j=i;j<n;j++) { if(b[j][i]!=0) temp(b[i],b[j],2*n); //交换两行 } // b[i][i] 不等于 0 的情况 for(k=i+1;k<n;k++) { yinzhi = -1 * b[k][i] / b[i][i]; for(u=0; u < 2*n; u++) { b[k][u] = b[k][u] + b[i][u] * yinzhi; } } } det1 = fun(a);// 获取行列式的值 if(det1 == 0) // 如果行列式的值为0 则是不可逆的。 { cout<<"此矩阵不可逆:"<<endl; return 0; } if(det1 != 0) { for(i=0; i<n; i++) //左矩阵 的对角线 全部 转化为 1 { bb = b[i][i]; // bb 不会等于0 因为对角线有有一个为0 说明行列式的值为零, for(j=0; j<2*n; j++) b[i][j] = b[i][j] / bb; } for(i=n-1; i>0; i--) for(k=0; k<i; k++) { bb = b[k][i]; for(u=0; u<2*n; u++) b[k][u] = b[k][u] - bb*b[i][u]; } } //------------测试查看---------- /* cout<<"变化后的at矩阵"<<endl; for(i=0;i<n;i++) for(j=0;j<2*n;j++) { cout<<setw(6)<<b[i][j]; kk=kk+1; if(kk%(2*n)==0) cout<<endl; } cout<<endl; */ //------------------------------ for(i=0; i<n; i++) for(j=0; j<n; j++) c[i][j] = b[i][j+n]; kk = 0; if(det1!=0) //输出逆矩阵 { cout<<"其可逆且其行列式的值det为:"<<det1<<endl<<endl; cout<<"可逆a矩阵的逆矩阵为c矩阵:"<<endl; for(i=0; i<n; i++) for(j=0; j<n; j++) { cout<<setw(15)<<c[i][j]; kk = kk+1; if(kk%n == 0) cout<<endl; } } return 0; } void temp(double aa[],double bb[],int n) { //交换数组指定的两行,即进行行变换(具体为行交换) int i; double temp1; for(i=0; i<n; i++) { temp1 = aa[i]; aa[i] = bb[i]; bb[i] = temp1; } } double fun(double array ) { int ii,jj,k,u; int iter = 0; double det1=1,yin; for(ii=0; ii<n; ii++) { if(array[ii][ii] == 0) for(jj=ii;jj<n;jj++) { if(array[jj][ii] != 0) { temp(array[ii],array[jj],n);//交换两行 iter++; } } for(k=ii+1; k<n; k++) { yin = -1 * array[k][ii] / array[ii][ii]; for(u=0; u<n; u++) { array[k][u] = array[k][u] + array[ii][u] * yin; } } } for(ii=0;ii<n;ii++) det1 = det1 * array[ii][ii]; if(iter % 2 == 1) det1 = -det1; return (det1); //返回行列式的值 }
运行结果如下:
1.
2.
相关文章推荐
- C++ 求一个矩阵的行列式的值(星星笔记)
- 从易到难编写C++程序,(8)问题:实现一个矩阵类
- 一个C++程序员的Delphi学习笔记
- Effective C++ 01 视C++为一个语言联邦 笔记
- c++第九周【任务4】建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数,完成矩阵的输入、输出、加、减、相等判断等操作。
- 《C++第九周实验报告4-1》---建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数, //完成矩阵的输入、输出、加、减、相等判断等操作。
- (大卫的阅读笔记)More Effective C++ Item 附2:一个auto_ptr的实现实例
- Matlab求矩阵的逆矩阵的C++代码
- C++/GDI+ 学习笔记(五)——实用技巧——颜色矩阵(ColorMatrix)
- Effective C++ 学习笔记:为含指针变量的类声明一个拷贝构造函数和一个赋值操作符
- C++递归问题之二——n皇后问题:以四、八皇后为例,给定n个皇后要求将它们放在一个n维矩阵中,任意两个皇后不能出现在同一行、列、主副对角线上,输出具体的摆放方式
- modern c++ design 笔记(如何列印一个TYPELIST)
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(3) 最大子序列和问题
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(2) IntCell类
- 【转】C++/GDI+ 学习笔记(四)——实用技巧——颜色矩阵(ColorMatrix)
- 一个C++程序员的Delphi学习笔记
- C++/GDI+ 学习笔记(四)——实用技巧——颜色矩阵(ColorMatrix)
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(1) f(x) = 2f(x-1) + x^2
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(5)欧几里得算法欧几里得算法求最大公约数
- Effective c++ 学习笔记之条款一视C++为一个语言联邦