📄 matrix.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 + -