求一般矩阵的逆矩阵C++代码
2012-08-27 22:58
162 查看
采用全选主元高斯消去法求解一般矩阵的逆矩阵,用C++代码实现。
//RINV.cpp
//一般矩阵求逆
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
class rinv //矩阵类
{
private:
int n;
double **a;
public:
rinv(int nn) //构造函数
{
int i;
n = nn;
a = new double*
;
for(i=0;i<n;i++) a[i] = new double[n+8];
}
void input();
void inv();
void output();
~rinv() //析构函数
{
int i;
for(i=0;i<n;i++) {delete[] a[i];}
delete[] a;
}
};
void rinv::input() //输入函数
{
int i,j;
char str1[20];
cout<<"输入文件名:";
cin>>str1;
ifstream fin(str1);
if(!fin)
{cout<<"\n不能打开这个文件"<<str1<<endl;exit(1);}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
fin>>a[i][j];
fin.close();
}
void rinv::inv() //矩阵求逆
{
int *is,*js,i,j,k;
double d,p;
is = new int
;
js = new int
;
for(k=0;k<n;k++)
{
d = 0.0;
for(i=k;i<n;i++)
for(j=k;j<n;j++)
{
p = fabs(a[i][j]);
if(p>d){d = p;is[k] = i;js[k] = j;}
}
if(d + 1.0 == 1.0)
{
delete[] is,js;
cout<<"\nA为奇异矩阵!没有逆矩阵。"<<endl;
exit(1);
}
if(is[k]!=k) //全选主元
for(j=0;j<n;j++)
{
p = a[k][j];a[k][j] = a[is[k]][j];a[is[k]][j] = p;
}
if(js[k]!=k)
for(i=0;i<n;i++)
{
p = a[i][k];a[i][k] = a[i][js[k]];a[i][js[k]] = p;
}
a[k][k] = 1.0/a[k][k];
for(j=0;j<n;j++)
if(j!=k) a[k][j] = a[k][j]*a[k][k];
for(i=0;i<n;i++)
if(i!=k)
for(j=0;j<n;j++)
if(j!=k) a[i][j] = a[i][j] - a[i][k]*a[k][j];
for(i=0;i<n;i++)
if(i!=k) a[i][k]=-a[i][k]*a[k][k];
}
for(k=n-1;k>=0;k--)
{
if(js[k]!=k)
for(j=0;j<n;j++)
{
p = a[k][j];a[k][j] = a[js[k]][j];a[js[k]][j] = p;
}
if(is[k]!=k)
for(i=0;i<n;i++)
{
p = a[i][k];a[i][k] = a[i][is[k]];a[i][is[k]] = p;
}
}
delete[] is,js;
}
void rinv::output()
{
int i,j;
char str2[20];
cout<<"输出文件名:";
cin>>str2;
ofstream fout (str2);
if(!fout)
{cout<<"\n不能打开这个文件"<<str2<<endl;exit(1);}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{ fout<<" "<<a[i][j];
cout<<" "<<a[i][j];
}
fout<<endl;cout<<endl;
}
fout.close();
}
int main() //主函数
{
rinv c(4);
c.input();
c.inv();
c.output();
return 0;
}
//RINV.cpp
//一般矩阵求逆
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
class rinv //矩阵类
{
private:
int n;
double **a;
public:
rinv(int nn) //构造函数
{
int i;
n = nn;
a = new double*
;
for(i=0;i<n;i++) a[i] = new double[n+8];
}
void input();
void inv();
void output();
~rinv() //析构函数
{
int i;
for(i=0;i<n;i++) {delete[] a[i];}
delete[] a;
}
};
void rinv::input() //输入函数
{
int i,j;
char str1[20];
cout<<"输入文件名:";
cin>>str1;
ifstream fin(str1);
if(!fin)
{cout<<"\n不能打开这个文件"<<str1<<endl;exit(1);}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
fin>>a[i][j];
fin.close();
}
void rinv::inv() //矩阵求逆
{
int *is,*js,i,j,k;
double d,p;
is = new int
;
js = new int
;
for(k=0;k<n;k++)
{
d = 0.0;
for(i=k;i<n;i++)
for(j=k;j<n;j++)
{
p = fabs(a[i][j]);
if(p>d){d = p;is[k] = i;js[k] = j;}
}
if(d + 1.0 == 1.0)
{
delete[] is,js;
cout<<"\nA为奇异矩阵!没有逆矩阵。"<<endl;
exit(1);
}
if(is[k]!=k) //全选主元
for(j=0;j<n;j++)
{
p = a[k][j];a[k][j] = a[is[k]][j];a[is[k]][j] = p;
}
if(js[k]!=k)
for(i=0;i<n;i++)
{
p = a[i][k];a[i][k] = a[i][js[k]];a[i][js[k]] = p;
}
a[k][k] = 1.0/a[k][k];
for(j=0;j<n;j++)
if(j!=k) a[k][j] = a[k][j]*a[k][k];
for(i=0;i<n;i++)
if(i!=k)
for(j=0;j<n;j++)
if(j!=k) a[i][j] = a[i][j] - a[i][k]*a[k][j];
for(i=0;i<n;i++)
if(i!=k) a[i][k]=-a[i][k]*a[k][k];
}
for(k=n-1;k>=0;k--)
{
if(js[k]!=k)
for(j=0;j<n;j++)
{
p = a[k][j];a[k][j] = a[js[k]][j];a[js[k]][j] = p;
}
if(is[k]!=k)
for(i=0;i<n;i++)
{
p = a[i][k];a[i][k] = a[i][is[k]];a[i][is[k]] = p;
}
}
delete[] is,js;
}
void rinv::output()
{
int i,j;
char str2[20];
cout<<"输出文件名:";
cin>>str2;
ofstream fout (str2);
if(!fout)
{cout<<"\n不能打开这个文件"<<str2<<endl;exit(1);}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{ fout<<" "<<a[i][j];
cout<<" "<<a[i][j];
}
fout<<endl;cout<<endl;
}
fout.close();
}
int main() //主函数
{
rinv c(4);
c.input();
c.inv();
c.output();
return 0;
}
相关文章推荐
- Matlab求矩阵的逆矩阵的C++代码
- C/C++实现矩阵的转置(示例代码)
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 一般互联网公司通用的c++代码规范
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- java编译回旋矩阵,C/C++通用算法代码
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 求矩阵的逆矩阵 c++
- C++代码片段——矩阵赋值
- 3d数学基础-镜像矩阵和切变矩阵-用C++代码实现
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 3d数学基础-欧拉角转换与旋转矩阵或旋转矩阵转换成欧拉角-用C++代码实现
- 最小二乘法的一般形式和矩阵形式原理推导和代码实现
- C++代码--两不同型矩阵相乘实现程…