矩阵类

矩阵的转置 相乘 二维数组的动态申请

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; }


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值