求满秩矩阵逆矩阵的自定义类Matrix
通过自定义类Matrix,求具有lines行的满秩矩阵的逆矩阵。给出以下几个要点:(1)矩阵行数(阶数)lines之值由用户任意输入(lines为类的私有数据成员)。(2...
通过自定义类Matrix,求具有lines行的满秩矩阵的逆矩阵。给出以下几个要点:
(1) 矩阵行数(阶数)lines之值由用户任意输入(lines为类的私有数据成员)。
(2) 先将欲求逆的原始矩阵另加一个单位矩阵放于matrA之中(MatrA为类的私有数据成员,被说明为: double ** MatrA;它所具有的lines行、2*lines列的存储空间通过new来动态分配),而原始矩阵的各元素值也由用户任意输入。
设法将MatrA左半的原始矩阵化为单位矩阵(利用行初等变换),此时,右半的原单位矩阵则变成了欲求的结果矩阵(即原始矩阵的逆矩阵)。 展开
(1) 矩阵行数(阶数)lines之值由用户任意输入(lines为类的私有数据成员)。
(2) 先将欲求逆的原始矩阵另加一个单位矩阵放于matrA之中(MatrA为类的私有数据成员,被说明为: double ** MatrA;它所具有的lines行、2*lines列的存储空间通过new来动态分配),而原始矩阵的各元素值也由用户任意输入。
设法将MatrA左半的原始矩阵化为单位矩阵(利用行初等变换),此时,右半的原单位矩阵则变成了欲求的结果矩阵(即原始矩阵的逆矩阵)。 展开
1个回答
展开全部
#include<iostream>
#include<iomanip>
using namespace std;
class Matrix
{
private:
int lines;
double **MatrA;
public:
Matrix();
~Matrix(){};
Matrix(Matrix &p1);
void give(int line);
void set(double **m1);
void jisuan();
void suanfa1(int j);
void suanfa2(int j);
void display();
};
Matrix::Matrix()
{
lines=0;
}
/*Matrix::Matrix(Matrix &p1)
{ lines=p1.lines;
double** MatrB=new double*[lines];
for(int i=0;i<lines;i++)
MatrB[i]=new double[2*lines];
for(int i=0;i<lines;i++)
{
for(int j=0;j<lines;j++)
{
MatrB[i][j]=MatrA[i][j];
}
}
}
*/
void Matrix::give(int line)
{
lines=line;
double** MatrA=new double*[lines];
for(int i=0;i<lines;i++)
MatrA[i]=new double[2*lines];
}
void Matrix::set(double **m1)
{
for(int i=0;i<lines;i++)
{
for(int j=0;j<lines;j++)
{
MatrA[i][j]=m1[i][j];
}
for(int k=0;k<lines;k++)
{
*(*(MatrA+i)+j)=1.0;
}
}
}
void Matrix::suanfa1(int j1)
{
for(int i=0;i<lines;i++)
{
double p1=*(*(MatrA+i)+j1);
for(int j=0;j<(2*lines);j++)
{
*(*(MatrA+i)+j)=(*(*(MatrA+i)+j))/p1;
}
}
}
void Matrix::suanfa2(int i1)
{
for(int i=0;i<lines;i++)
{
if(i!=i1)
{
for(int j=0;j<(2*lines);j++)
{
*(*(MatrA+i)+j)-=*(*(MatrA+i1)+j);
}
}
}
}
void Matrix::jisuan()
{
for(int i=0;i<lines;i++)
{
for(int j=0;j<lines;j++)
{
suanfa2(j);
}
suanfa1(1);
}
}
void Matrix::display()
{
for(int i=0;i<lines;i++)
{
for(int j=0;j<(2*lines);j++)
{
cout<<setw(4)<<*(*(MatrA+i)+j);
}
cout<<endl;
}
}
void main()
{
Matrix ma;
int n;
double pp;
cout<<"请输入矩阵的行数"<<endl;
cin>>n;
double**f1=new double*[n];
for(int i=0;i<n;i++)
f1[i]=new double[n];
cout<<"请输入矩阵:"<<endl;
for(int k=0;k<n;k++)
{
for(int j=0;j<n;j++)
{
cin>>pp;
*(*(f1+k)+j)=pp;
}
}
cout<<"您输入的数组是"<<endl;
for(int a=0;a<n;a++)
{
for(int j=0;j<n;j++)
{
cout<<setw(4)<<*(*(f1+a)+j);
}
cout<<endl;
}
ma.give(n);
ma.set(f1);
cout<<"求逆矩阵变换之前:"<<endl;
ma.display();
ma.jisuan();
cout<<"求逆矩阵变换之后:"<<endl;
ma.display();
}
给分吧
#include<iomanip>
using namespace std;
class Matrix
{
private:
int lines;
double **MatrA;
public:
Matrix();
~Matrix(){};
Matrix(Matrix &p1);
void give(int line);
void set(double **m1);
void jisuan();
void suanfa1(int j);
void suanfa2(int j);
void display();
};
Matrix::Matrix()
{
lines=0;
}
/*Matrix::Matrix(Matrix &p1)
{ lines=p1.lines;
double** MatrB=new double*[lines];
for(int i=0;i<lines;i++)
MatrB[i]=new double[2*lines];
for(int i=0;i<lines;i++)
{
for(int j=0;j<lines;j++)
{
MatrB[i][j]=MatrA[i][j];
}
}
}
*/
void Matrix::give(int line)
{
lines=line;
double** MatrA=new double*[lines];
for(int i=0;i<lines;i++)
MatrA[i]=new double[2*lines];
}
void Matrix::set(double **m1)
{
for(int i=0;i<lines;i++)
{
for(int j=0;j<lines;j++)
{
MatrA[i][j]=m1[i][j];
}
for(int k=0;k<lines;k++)
{
*(*(MatrA+i)+j)=1.0;
}
}
}
void Matrix::suanfa1(int j1)
{
for(int i=0;i<lines;i++)
{
double p1=*(*(MatrA+i)+j1);
for(int j=0;j<(2*lines);j++)
{
*(*(MatrA+i)+j)=(*(*(MatrA+i)+j))/p1;
}
}
}
void Matrix::suanfa2(int i1)
{
for(int i=0;i<lines;i++)
{
if(i!=i1)
{
for(int j=0;j<(2*lines);j++)
{
*(*(MatrA+i)+j)-=*(*(MatrA+i1)+j);
}
}
}
}
void Matrix::jisuan()
{
for(int i=0;i<lines;i++)
{
for(int j=0;j<lines;j++)
{
suanfa2(j);
}
suanfa1(1);
}
}
void Matrix::display()
{
for(int i=0;i<lines;i++)
{
for(int j=0;j<(2*lines);j++)
{
cout<<setw(4)<<*(*(MatrA+i)+j);
}
cout<<endl;
}
}
void main()
{
Matrix ma;
int n;
double pp;
cout<<"请输入矩阵的行数"<<endl;
cin>>n;
double**f1=new double*[n];
for(int i=0;i<n;i++)
f1[i]=new double[n];
cout<<"请输入矩阵:"<<endl;
for(int k=0;k<n;k++)
{
for(int j=0;j<n;j++)
{
cin>>pp;
*(*(f1+k)+j)=pp;
}
}
cout<<"您输入的数组是"<<endl;
for(int a=0;a<n;a++)
{
for(int j=0;j<n;j++)
{
cout<<setw(4)<<*(*(f1+a)+j);
}
cout<<endl;
}
ma.give(n);
ma.set(f1);
cout<<"求逆矩阵变换之前:"<<endl;
ma.display();
ma.jisuan();
cout<<"求逆矩阵变换之后:"<<endl;
ma.display();
}
给分吧
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询