⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.cpp

📁 这是一个可进行矩阵维数变换的程序
💻 CPP
字号:
#include "stdlib.h"
#include "math.h"
#include "matrix.h"
#include "fstream.h"

int brinv(double*,int);

CMatrix::CMatrix()
{
	m_nRow=0;
	m_nCol=0;
	m_pData=0;

}

CMatrix::~CMatrix()
{
	if(m_pData!=0)
	{
		delete[] m_pData[0];
		delete[] m_pData;
	}
	m_pData=0;
}

CMatrix::CMatrix(int m, int n)//定义为m,n阶零矩阵
{								
	m_nRow=m;
	m_nCol=n;
	m_pData=new double*[m_nRow];
	m_pData[0]=new double[m_nRow*m_nCol];
	for(int i=0;i<m_nRow;i++)
		m_pData[i]=m_pData[0]+i*m_nCol;
	for(i=0;i<m_nRow;i++)
		for(int j=0;j<m_nCol;j++)
			m_pData[i][j]=0.0;
}
CMatrix::CMatrix(int m, int n,double *pdata)//定义为m,n阶矩阵
{								
	m_nRow=m;
	m_nCol=n;
	m_pData=new double*[m_nRow];
	m_pData[0]=new double[m_nRow*m_nCol];
	for(int i=0;i<m_nRow;i++)
		m_pData[i]=m_pData[0]+i*m_nCol;
	for(i=0;i<m_nRow;i++)
		for(int j=0;j<m_nCol;j++)
			m_pData[i][j]=pdata[i*m_nCol+j];
}
CMatrix::CMatrix(CMatrix& m)
{
	m_nRow=m.m_nRow;
	m_nCol=m.m_nCol;
	if(m.m_nRow==0||m.m_nCol==0)
	{
		m_pData=0;
		return;
	}
	m_pData=new double*[m_nRow];
	m_pData[0]=new double[m_nRow*m_nCol];
	for(int i=0;i<m_nRow;i++)
		m_pData[i]=m_pData[0]+i*m_nCol;
	for(i=0;i<m_nRow;i++)
		for(int j=0;j<m_nCol;j++)
			m_pData[i][j]=m.m_pData[i][j];
}
CMatrix& CMatrix::operator=(CMatrix& m)
{
	if(m_nRow==m.m_nRow&&m_nCol==m.m_nCol)
	{
		for(int i=0;i<m_nRow;i++)
			for(int j=0;j<m_nCol;j++)
				m_pData[i][j]=m.m_pData[i][j];
	}
	else
	{
		if(m_nRow!=0||m_nCol!=0){
			delete[] m_pData[0];
			delete[] m_pData;
		}
		m_nRow=m.m_nRow;
		m_nCol=m.m_nCol;
		m_pData=new double*[m_nRow];
		m_pData[0]=new double[m_nRow*m_nCol];
		for(int i=0;i<m_nRow;i++)
			m_pData[i]=m_pData[0]+i*m_nCol;
		for(i=0;i<m_nRow;i++)
			for(int j=0;j<m_nCol;j++)
				m_pData[i][j]=m.m_pData[i][j];
	}
	return *this;
}
CMatrix CMatrix::operator+(CMatrix& m)
{
	if(m_nRow==m.m_nRow&&m_nCol==m.m_nCol)
	{
		CMatrix temp(m_nRow,m_nCol);
		for(int i=0;i<m_nRow;i++)
			for(int j=0;j<m_nCol;j++)
				temp.m_pData[i][j]=m_pData[i][j]+m.m_pData[i][j];
		return temp;
	}
	else
	{
		CMatrix zero;
		return zero;
	}

}
void CMatrix::operator+=(CMatrix& m)
{
	if(m_nRow==m.m_nRow&&m_nCol==m.m_nCol)
	{
		for(int i=0;i<m_nRow;i++)
			for(int j=0;j<m_nCol;j++)
				m_pData[i][j]+=m.m_pData[i][j];
	}
	else
	{
		m_nRow=0;m_nCol=0;
	}

}
CMatrix CMatrix::operator-(CMatrix& m)
{
	if(m_nRow==m.m_nRow&&m_nCol==m.m_nCol)
	{
		CMatrix temp(m_nRow,m_nCol);
		for(int i=0;i<m_nRow;i++)
			for(int j=0;j<m_nCol;j++)
				temp.m_pData[i][j]=m_pData[i][j]-m.m_pData[i][j];
		return temp;
	}
	else
	{
		CMatrix zero;
		return zero;
	}

}
void CMatrix::operator-=(CMatrix& m)
{
	if(m_nRow==m.m_nRow&&m_nCol==m.m_nCol)
	{
		for(int i=0;i<m_nRow;i++)
			for(int j=0;j<m_nCol;j++)
				m_pData[i][j]-=m.m_pData[i][j];
	}
	else
	{
		m_nRow=0;m_nCol=0;
	}
}
CMatrix CMatrix::operator*(CMatrix& m)
{

	if(m_nCol==m.m_nRow)
	{
		CMatrix temp(m.m_nRow,m_nCol);
		for(int i=0;i<m_nRow;i++)
			for(int j=0;j<m.m_nCol;j++)
				for(int k=0;k<m_nCol;k++)
					temp.m_pData[i][j]+=m_pData[i][k]*m.m_pData[k][j];
		return temp;
	}
	else
	{
		CMatrix zero;
		return zero;
	}
}
CMatrix CMatrix::operator*(double a)
{
	CMatrix temp(m_nRow,m_nCol);
	for(int i=0;i<m_nRow;i++)
		for(int j=0;j<m_nCol;j++)
			temp.m_pData[i][j]=a*m_pData[i][j];
	return temp;
}

CMatrix CMatrix::operator!()
{
	CMatrix zero;
	if(m_nRow!=m_nCol)
		return zero;
	CMatrix temp(*this);
	int ret=brinv(temp,m_nRow);
	if(ret!=0)
		return temp;
	else
		return zero;
}

CMatrix CMatrix::operator/(CMatrix& m)
{
	CMatrix zero;
	if(m_nRow!=m_nCol||m_nRow!=m.m_nRow)
		return zero;
	CMatrix temp=!m;
	CMatrix temp1=(*this)*temp;
	return temp1;
}
double*  CMatrix::operator[](int i)
{
	return m_pData[i];
}

CMatrix::operator double *()
{
	return m_pData[0];
}
CMatrix::operator double **()
{
	return m_pData;
}
ifstream& operator>>(ifstream& ifile,CMatrix& m)
{
	if(m.m_nRow+m.m_nRow!=0){
		delete[] m.m_pData[0];
		delete[] m.m_pData;
		m.m_pData=0;
		m.m_nRow=0;
		m.m_nCol=0;
	}
	int row=0,col=0;
	long startpos=ifile.tellg();
	ifile.eatwhite();
	int ch=ifile.get();
	col=0;
	while(ch!='\n'&&ch!=EOF)
	{
		while(ch!=' '&&ch!='\t'&&ch!='\n'&&ch!=EOF)
		{	ch=ifile.get();
		}
		col++;
		while(ch==' '||ch=='\t')
		{	ch=ifile.get();
		}
	}

	int coltemp=col;
	ifile.clear();
	ifile.seekg(startpos);
	ifile.eatwhite();
	ch=ifile.get();
	while(ch!=EOF)
	{
		coltemp=0;
		while(ch!='\n'&&ch!=EOF)
		{
			while(ch!=' '&&ch!='\t'&&ch!='\n'&&ch!=EOF)
			{	ch=ifile.get();
			}
			coltemp++;
			while(ch==' '||ch=='\t')
			{	ch=ifile.get();
			}
		}
		if(coltemp!=col)break;
		row++;
		ch=ifile.peek();
		while(ch==' '||ch=='\t')
		{	ch=ifile.get();
		}
	}
	ifile.clear();
	ifile.seekg(startpos);
	CMatrix m1(row,col);
	for(int i=0;i<row;i++)
		for(int j=0;j<col;j++)
			ifile>>m1.m_pData[i][j];
	m=m1;
	return ifile;
}
ofstream& operator<<(ofstream& ofile,CMatrix& m)
{
	for(int i=0;i<m.m_nRow;i++)
	{
		for(int j=0;j<m.m_nCol;j++)
		{
			ofile.width(12);
			ofile<<m.m_pData[i][j]<<"    ";
		}
		ofile<<endl;
	}
	ofile<<endl;
	return ofile;
}

int brinv(double* a,int n)
{
	int *is,*js,i,j,k,l,u,v;
	double d,p;
	is=new int[n*sizeof(int)];
	js=new int[n*sizeof(int)];
	for (k=0; k<=n-1; k++)
	{	d=0.0;
		for (i=k; i<=n-1; i++)
		for (j=k; j<=n-1; j++)
		{	 l=i*n+j; p=fabs(a[l]);
			if (p>d) { d=p; is[k]=i; js[k]=j;}
		}
		if (d+1.0==1.0)
		{	delete is; delete js;
			return 0 ;
		}
		if (is[k]!=k)
			for (j=0; j<=n-1; j++)
			{	 u=k*n+j; v=is[k]*n+j;
				p=a[u]; a[u]=a[v]; a[v]=p;
			}
		if (js[k]!=k)
			for (i=0; i<=n-1; i++)
			{	 u=i*n+k; v=i*n+js[k];
				p=a[u]; a[u]=a[v]; a[v]=p;
			}
		l=k*n+k;
		a[l]=1.0/a[l];
		for (j=0; j<=n-1; j++)
			if (j!=k)
				{ u=k*n+j; a[u]=a[u]*a[l];}
		for (i=0; i<=n-1; i++)
			if (i!=k)
				for (j=0; j<=n-1; j++)
					if (j!=k)
					{	u=i*n+j;
						a[u]=a[u]-a[i*n+k]*a[k*n+j];
					}
		for (i=0; i<=n-1; i++)
			if (i!=k)
			{	 u=i*n+k; a[u]=-a[u]*a[l];}
	}
	for (k=n-1; k>=0; k--)
	{	if (js[k]!=k)
			for (j=0; j<=n-1; j++)
			{	u=k*n+j; v=js[k]*n+j;
				p=a[u]; a[u]=a[v]; a[v]=p;
			}
		if (is[k]!=k)
			for (i=0; i<=n-1; i++)
			{	u=i*n+k; v=i*n+is[k];
				p=a[u]; a[u]=a[v]; a[v]=p;
			}
	}
	delete is; delete js;
	return 1 ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -