矩阵类

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

 

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



 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值