因为编程需要,在VC++中自己写了个矩阵类,因为是初学,写得不够抽象,还望看客多多包涵
#include<iostream.h>
class Matrix
{
int RowMax,ColMax;
public:
float **Mat;
Matrix(int rm,int cm)//构造函数
{
RowMax=rm;
ColMax=cm;
Mat=new float *[rm];
for(int i=0;i<rm;i++)
Mat[i]=new float[cm];
}
~Matrix(){}//析构函数
void Input()//输入
{
cout<<"请输入矩阵:\n";
for(int i=0;i<RowMax;i++)
for(int j=0;j<ColMax;j++)
cin>>Mat[i][j];
}
int GetRowMax(){return RowMax;}//取矩阵的行数
int GetColMax(){return ColMax;} //取矩阵的列数
void Matrix::GetRow(const int n)//取矩阵某一行的全部元素
{
cout<<"Matrix(:,"<<n<<")=\n"<<'\t';
for(int i=0;i<ColMax;i++)
cout<<Mat[n-1][i]<<'\t';
cout<<'\n';
}
void Matrix::GetCol(const int n)//取矩阵某一列的全部元素
{
cout<<"Matrix(:,"<<n<<")=\n";
for(int i=0;i<RowMax;i++)
cout<<'\t'<<Mat[i][n-1]<<'\n';
}
void Print()//显示矩阵
{
cout<<"Matrix=\n";
for(int i=0;i<RowMax;i++)
{
for(int j=0;j<ColMax;j++)
cout<<Mat[i][j]<<'\t';
cout<<'\n';
}
}
Matrix operator+(Matrix &m)//矩阵加法;可直接写Matrix t1(2,2),t2(2,2),t3(2,2);t3=t1+t2
{
Matrix t(RowMax,ColMax);
for(int i=0;i<RowMax;i++)
for(int j=0;j<ColMax;j++)
t.Mat[i][j]=Mat[i][j]+m.Mat[i][j];
return t;
}
Matrix operator-(Matrix &m)//矩阵减法;可直接写Matrix t1(2,2),t2(2,2),t3(2,2);t3=t1-t2
{
Matrix t(RowMax,ColMax);
for(int i=0;i<RowMax;i++)
for(int j=0;j<ColMax;j++)
t.Mat[i][j]=Mat[i][j]-m.Mat[i][j];
return t;
}
Matrix operator*(Matrix &m)//矩阵乘法;可直接写Matrix t1(2,3),t2(3,2),t3(2,2);t3=t1*t2
{
Matrix t(RowMax,m.ColMax);
for(int i=0;i<RowMax;i++)
for(int j=0;j<m.ColMax;j++)
{
float sum=0;
for(int k=0;k<ColMax;k++)
sum+=Mat[i][k]*m.Mat[k][j];
t.Mat[i][j]=sum;
}
return t;
}
void Trans();//矩阵转置
void Inv();//矩阵求逆
};
void Matrix::Trans()
{
const int rm=RowMax;
const int cm=ColMax;
Matrix tmat(cm,rm);
for(int i=0;i<cm;i++)
for(int j=0;j<rm;j++)
tmat.Mat[i][j]=Mat[j][i];
cout<<"Matrix'=\n";
for(i=0;i<cm;i++)
{
cout<<'\t';
for(int j=0;j<rm;j++)
cout<<tmat.Mat[i][j]<<'\t';
cout<<'\n';
}
}
void Matrix::Inv()
{
const int rm=RowMax;
const int cm=ColMax;
Matrix imat(rm,cm);
Matrix mat(rm,cm);
for(int i=0;i<rm;i++)
for(int j=0;j<rm;j++)
mat.Mat[i][j]=Mat[i][j];
for(i=0;i<rm;i++)
for(int j=0;j<rm;j++)
imat.Mat[i][j]=0;
for(i=0;i<rm;i++)
imat.Mat[i][i]=1;
for(i=0;i<rm;i++)
{
for(int j=0;j<rm;j++)
{
if(i!=j)
{
float t=mat.Mat[j][i]/mat.Mat[i][i];
for(int k=0;k<rm;k++)
{
mat.Mat[j][k]-=mat.Mat[i][k]*t;
imat.Mat[j][k]-=imat.Mat[i][k]*t;
}
}
}
}
for(i=0;i<rm;i++)
if(mat.Mat[i][i]!=1)
{
float t=mat.Mat[i][i];
for(int j=0;j<rm;j++)
{
mat.Mat[i][j]=mat.Mat[i][j]/t;
imat.Mat[i][j]=imat.Mat[i][j]/t;
}
}
cout<<"Matrix=\n";
for(i=0;i<rm;i++)
{
for(int j=0;j<rm;j++)
cout<<mat.Mat[i][j]<<'\t';
cout<<'\n';
}
cout<<"Inverse=\n";
for(i=0;i<rm;i++)
{
for(int j=0;j<rm;j++)
cout<<imat.Mat[i][j]<<'\t';
cout<<'\n';
}
}
void main()//main函数中可自行更改自己想写的程序段,我这边写出部分只是为了举例
{
Matrix mat1(2,3),mat2(3,2),mat3(2,2);
mat1.Input();
mat2.Input();
mat3=mat1*mat2;
mat3.Print();
}