矩阵的转置 相乘 二维数组的动态申请
matrix.h文件
class Matrix
{
private:
int **pmatrix;//存储矩阵元素
int imaxx,imaxy;//矩阵大小
static int matrixnum;//矩阵对象之和
public:
Matrix(unsigned int x,unsigned int y);
Matrix(Matrix &m);
~Matrix();
bool SetValue(unsigned int x,unsigned int y,int value);
void input();
void print() const;
Matrix operator * (Matrix &m);
Matrix operator = (Matrix &m);
friend Matrix Rotate(Matrix &m);//矩阵逆置
friend Matrix Mul(Matrix a,Matrix b);//矩阵乘积
friend Matrix Mul1(Matrix *pa,Matrix *pb);
friend Matrix Mul2(Matrix &a,Matrix &b);
};
matrix.cpp文件
#include"matrix.h"
#include<iostream>
using namespace std;
int Matrix::matrixnum=0;
Matrix::Matrix(unsigned int x,unsigned int y)
{
pmatrix=new int *[x];//为2级指针申请空间,每个元素是一个一级指针
if(!pmatrix)
{
cerr<<"Matrix constructing error"<<endl;
exit(0);
}
for(int i=0;i<x;i++)
pmatrix[i]=new int[y];//为每个一级指针申请空间
imaxx=x;
imaxy=y;
matrixnum++;
}
Matrix::Matrix(Matrix &m)
{
imaxx=m.imaxx;
imaxy=m.imaxy;
pmatrix=new int *[imaxx];
if(!pmatrix)
{
cerr<<"Matrix construction error"<<endl;
exit(0);
}
for(int i=0;i<imaxx;i++)
pmatrix[i]=new int[imaxy];
for(i=0;i<imaxx;i++)
for(int j=0;j<imaxy;j++)
pmatrix[i][j]=m.pmatrix[i][j];
matrixnum++;
}
Matrix Matrix::operator =(Matrix &m)
{
//删除原来空间
for(int i=0;i<imaxx;i++)
delete[]pmatrix[i];
delete[]pmatrix;
imaxx=m.imaxx;
imaxy=m.imaxy;
pmatrix=new int *[imaxx];
if(!pmatrix)
{
cerr<<"Matrix construction error"<<endl;
exit(0);
}
for(i=0;i<imaxx;i++)
pmatrix[i]=new int[imaxy];
for(i=0;i<imaxx;i++)
for(int j=0;j<imaxy;j++)
pmatrix[i][j]=m.pmatrix[i][j];
matrixnum++;
return *this;
}
Matrix::~Matrix()
{
for(int i=0;i<imaxx;i++)
delete[]pmatrix[i];
delete[]pmatrix;
matrixnum--;
}
bool Matrix::SetValue(unsigned int x,unsigned int y,int value)
{
if((x>=imaxx)||(y>=imaxy))
{
cerr<<"Invalid(x,y): "<<x<<","<<y<<endl;
return false;
}
else
{
pmatrix[x][y]=value;
return true;
}
}
void Matrix::input()
{
int ix,iy,value;
for(ix=0;ix<imaxx;ix++)
for(iy=0;iy<imaxy;iy++)
{
cin>>value;
SetValue(ix,iy,value);
}
}
void Matrix::print()const
{
int ix,iy;
cout<<"Sum of matrix objects = "<<matrixnum<<endl;
cout<<"Matrix ("<<imaxx<<","<<imaxy<<") is";
for(ix=0;ix<imaxx;ix++)
{
cout<<endl;
for(iy=0;iy<imaxy;iy++)
cout<<pmatrix[ix][iy]<<" ";
}
}
Matrix Matrix::operator * (Matrix &m)
{
if(imaxy!=m.imaxx)
{
cerr<<"Cannot multiply Matrix a with b"<<endl;
return *this;
}
int ix,iy,iz;
Matrix c(imaxx,m.imaxy);
for(ix=0;ix<imaxx;ix++)
for(iy=0;iy<m.imaxy;iy++)
{
c.pmatrix[ix][iy]=0;
for(iz=0;iz<imaxy;iz++)
c.pmatrix[ix][iy]+=pmatrix[ix][iz]*m.pmatrix[iz][iy];
}
return c;
}
Matrix Rotate(Matrix &m)
{
unsigned int i,j;
Matrix mr(m.imaxy,m.imaxx);
for(i=0;i<m.imaxx;i++)
for(j=0;j<m.imaxy;j++)
mr.pmatrix[j][i]=m.pmatrix[i][j];
return mr;
}
//传值方式,求矩阵乘积
Matrix Mul(Matrix a,Matrix b)
{
if(a.imaxy!=b.imaxx)
{
cerr<<"Cannot multiply Matrix awith b"<<endl;
return a;
}
int ix,iy,iz;
Matrix c(a.imaxx,b.imaxy);
for(ix=0;ix<a.imaxx;ix++)
for(iy=0;iy<b.imaxy;iy++)
{
c.pmatrix[ix][iy]=0;
for(iz=0;iz<a.imaxy;iz++)
c.pmatrix[ix][iy]+=a.pmatrix[ix][iz]*b.pmatrix[iz][iy];
}
return c;
}
//传地址方式求矩阵乘积
Matrix Mul1(Matrix *pa,Matrix *pb)
{
if(!pa || !pb)
{
cerr<<"Invalid matrix a or b!"<<endl;
exit(1);
}
if(pa->imaxy!=pb->imaxx)
{
cerr<<"Cannot multiply Matrix a with b!"<<endl;
exit(1);
}
int ix,iy,iz;
Matrix c(pa->imaxx,pb->imaxy);
for(ix=0;ix<pa->imaxx;ix++)
for(iy=0;iy<pb->imaxy;iy++)
{
c.pmatrix[ix][iy]=0;
for(iz=0;iz<pa->imaxy;iz++)
c.pmatrix[ix][iy]+=pa->pmatrix[ix][iz]*pb->pmatrix[iz][iy];
}
return c;
}
//引用方式,计算矩阵乘积
Matrix Mul2(Matrix &a,Matrix &b)
{
if(a.imaxy!=b.imaxx)
{
cerr<<"Cannot multiply Matrix awith b"<<endl;
return a;
}
int ix,iy,iz;
Matrix c(a.imaxx,b.imaxy);
for(ix=0;ix<a.imaxx;ix++)
for(iy=0;iy<b.imaxy;iy++)
{
c.pmatrix[ix][iy]=0;
for(iz=0;iz<a.imaxy;iz++)
c.pmatrix[ix][iy]+=a.pmatrix[ix][iz]*b.pmatrix[iz][iy];
}
return c;
}
main.cpp文件
#include"matrix.h"
#include<iostream>
using namespace std;
int main()
{
Matrix a(2,2);
cout<<"Input Matrix a[2][2] :"<<endl;
a.input();
cout<<endl;
a.print();
cout<<endl;
Matrix b(2,3);
cout<<"Input Matrix b[2][3] :"<<endl;
b.input();
cout<<endl;
b.print();
cout<<endl;
cout<<"传值方式 Multiply Matrix a with b: "<<endl;
Matrix c=Mul(a,b);
c.print();
cout<<endl;
cout<<"引用方式 Multiply Matrix a with b: "<<endl;
Matrix d=Mul2(a,b);
d.print();
cout<<endl;
cout<<"传址方式 Multiply Matrix a with b: "<<endl;
Matrix e=Mul1(&a,&b);
e.print();
cout<<endl;
cout<<"运算符重载 Multiply a with b: "<<endl;
Matrix g=a*b;
g.print();
cout<<endl;
cout<<"Reserve of Matrix b[2][3]: "<<endl;
Matrix f=Rotate(b);
f.print();
cout<<endl;
return 0;
}