📄 cmatrix.cpp
字号:
{
pp.setelem(i,j,p(i,j));
}
for(j=cp;j<c;j++)
{
pp.setelem(i,j,q(i,(j-cp)));
}
}
return pp;
}
//将p矩阵与q矩阵上下合并为一新的矩阵(i.e. P'={p/q}):
CMatrix operator % (CMatrix p,CMatrix q)
{
unsigned i,j,r,c,rp,rq;
CMatrix pp;
if(q.getcols()!=p.getcols())
{
AfxMessageBox("%运算错误:列数不同,无法合并两个矩阵!");
return pp;
}
rp=p.getrows();
rq=q.getrows();
r =rp+rq;
c =q.getcols();
pp.setvalue(r,c);
for(i=0;i<rp;i++)
{
for(j=0;j<c;j++)
{
pp.setelem(i,j,p(i,j));
}
}
for(i=rp;i<r;i++)
{
for(j=0;j<c;j++)
{
pp.setelem(i,j,q((i-rp),j));
}
}
return pp;
}
//除法:
CMatrix operator / (CMatrix p,double q)
{
unsigned i,j,r,c;
double t;
r=p.rows;
c=p.cols;
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
t=p(i,j)/q;
p.setelem(i,j,t);
}
}
return p;
}
//求转置:
CMatrix operator ~ (CMatrix p)
{
int i,j,r,c;
r=p.rows;
c=p.cols;
CMatrix Temp(c,r);
for(i=0;i<c;i++)
{
for(j=0;j<r;j++)
{
Temp.setelem(i,j,p(j,i));
}
}
return Temp;
}
//求逆矩阵:
CMatrix operator ! (CMatrix p)
{
if(p.rows!=p.cols)
{
AfxMessageBox("求逆矩阵错误:不能进行求逆:cols!=rows");
return p;
}
p.cinv(p.elems,p.rows);
return p;
}
//减法:
CMatrix operator - (CMatrix p)
{
unsigned i,j;
CMatrix t(p.rows,p.cols);
t=p;
for(i=0;i<p.rows;i++)
{
for(j=0;j<p.cols;j++)
{
p.setelem(i,j,-t(i,j));
}
}
return p;
}
int CMatrix::calroot()//求方程组的根;
{
unsigned i,j,k;
unsigned * mj;//主元所在行;
unsigned dlted;
double p,d;
mj=new unsigned[rows];
if(cols!=(rows+1))
{
AfxMessageBox("calroot错误:CMatrix:矩阵列数不对!");
return 0;
}
for(i=0;i<(cols-1);i++)
{
//找主元:
d=0.0;
for(j=0;j<rows;j++)
{
dlted=0;
for(k=0;k<=i;k++)
{
if(mj[k]==j)
{
dlted=1;
}
}
p=fabs(elems[j*cols+i]);
if(p>d&&dlted==0)
{
d=p;
mj[i]=j;
}
}
if(d<(1e-15))
{
AfxMessageBox("calrrot错误:矩阵奇异,无法求解!");
delete [] mj;
return 0;
}
//消元:
delelem(mj[i],i);
}
for(i=0;i<(cols-1);i++)
{
for(j=0;j<rows;j++)
{
if((fabs(elems[j*cols+i]-1.0)<1e-15)&&j!=i)
{
MoveRow(j,i);
}
}
}
delete [] mj;
return 1;
}
//求矩阵的模:
double CMatrix::mod()
{
double re;
double sum;
unsigned i,j;
sum=0;
for(i=0;i<rows;i++)
{
for(j=0;j<cols;j++)
{
sum=sum+elems[i*cols+j]*elems[i*cols+j];
}
}
re=sqrt(sum);
return re;
}
//将row1行移向row2行:
void CMatrix::MoveRow(unsigned int row1, unsigned int row2)
{
unsigned i,j;
if(row1>rows||row2>rows)
{
AfxMessageBox("MoveRow错误:矩阵下标越界!");
return;
}
double * temp;
temp=new double[cols];
for(i=0;i<cols;i++)
{
temp[i]=elems[row1*cols+i];//记下当前行;
}
//挪动row2以下、row1以上各行;
for(i=row1;i>row2;i--)
{
for(j=0;j<cols;j++)
{
elems[i*cols+j]=elems[(i-1)*cols+j];
}
}
for(i=0;i<cols;i++)
{
elems[row2*cols+i]=temp[i];
}
delete temp;
return;
}
void CMatrix::deleterow(unsigned int r)
{
if(rows==0||r>=rows||elems==0)
{
AfxMessageBox("deleterow错误:此时不能删除指定行!");
}
double * temp;
unsigned i,j;
rows-=1;
size=rows*cols;
temp=new double[size];
ASSERT(temp);
for(i=0;i<=rows;i++)
{
for(j=0;j<cols;j++)
{
if(i<r)
{
temp[i*cols+j]=elems[i*cols+j];
}
if(i>r)
{
temp[(i-1)*cols+j]=elems[i*cols+j];
}
}
}
if(elems!=0)
{
delete [] elems;
}
elems=new double[size];
for(i=0;i<size;i++)
{
elems[i]=temp[i];
}
delete [] temp;
}
void CMatrix::deletecol(unsigned int c)
{
if(cols==0||c>=cols||elems==0)
{
AfxMessageBox("deletecol错误:此时不能删除指定列!");
}
double * temp;
unsigned i,j;
cols-=1;
size=rows*cols;
temp=new double[size];
ASSERT(temp);
for(i=0;i<rows;i++)
{
for(j=0;j<=cols;j++)
{
if(j<c)
{
temp[i*cols+j]=elems[i*(cols+1)+j];
}
if(j>c)
{
temp[i*cols+j-1]=elems[i*(cols+1)+j];
}
}
}
if(elems!=0)
{
delete [] elems;
}
elems=new double[size];
for(i=0;i<size;i++)
{
elems[i]=temp[i];
}
delete [] temp;
}
UINT CMatrix::getrows()
{
return rows;
}
UINT CMatrix::getcols()
{
return cols;
}
UINT CMatrix::getsize()
{
return size;
}
//添加一行,使之成为第r行:
void CMatrix::addrow(UINT r,double dat[])
{
if(r>rows||elems==0)
{
AfxMessageBox("addrow错误:此时不能添加指定行!");
}
double * temp;
unsigned i,j;
rows+=1;
size=rows*cols;
temp=new double[size];
ASSERT(temp);
for(i=0;i<(rows-1);i++)
{
for(j=0;j<cols;j++)
{
if(i<r)
{
temp[i*cols+j]=elems[i*cols+j];
}
if(i>=r)
{
temp[(i+1)*cols+j]=elems[i*cols+j];
}
}
}
if(elems!=0)
{
delete [] elems;
}
elems=new double[size];
for(i=0;i<size;i++)
{
elems[i]=temp[i];
}
delete [] temp;
for(i=0;i<cols;i++)
{
setelem(r,i,dat[i]);
}
}
//添加一列,使之成为第c列:
void CMatrix::addcol(UINT c,double dat[])
{
if(c>cols||elems==0)
{
AfxMessageBox("addcol错误:此时不能删除指定列!");
}
double * temp;
unsigned i,j;
cols+=1;
size=rows*cols;
temp=new double[size];
ASSERT(temp);
for(i=0;i<rows;i++)
{
for(j=0;j<(cols-1);j++)
{
if(j<c)
{
temp[i*cols+j]=elems[i*(cols-1)+j];
}
if(j>=c)
{
temp[i*cols+j+1]=elems[i*(cols-1)+j];
}
}
}
if(elems!=0)
{
delete [] elems;
}
elems=new double[size];
for(i=0;i<size;i++)
{
elems[i]=temp[i];
}
delete [] temp;
for(i=0;i<rows;i++)
{
setelem(i,c,dat[i]);
}
}
//添加一行,使之成为第r行:
void CMatrix::addrow(UINT r,double dat)
{
if(r>rows||elems==0||cols>1)
{
AfxMessageBox("addrow错误:此时不能添加指定行!");
}
double * temp;
unsigned i,j;
rows+=1;
size=rows*cols;
temp=new double[size];
ASSERT(temp);
for(i=0;i<(rows-1);i++)
{
for(j=0;j<cols;j++)
{
if(i<r)
{
temp[i*cols+j]=elems[i*cols+j];
}
if(i>=r)
{
temp[(i+1)*cols+j]=elems[i*cols+j];
}
}
}
if(elems!=0)
{
delete [] elems;
}
elems=new double[size];
for(i=0;i<size;i++)
{
elems[i]=temp[i];
}
delete [] temp;
setelem(r,0,dat);
}
//添加一列,使之成为第c列:
void CMatrix::addcol(UINT c,double dat)
{
if(c>cols||elems==0||rows>1)
{
AfxMessageBox("addcol错误:此时不能删除指定列!");
}
double * temp;
unsigned i,j;
cols+=1;
size=rows*cols;
temp=new double[size];
ASSERT(temp);
for(i=0;i<rows;i++)
{
for(j=0;j<(cols-1);j++)
{
if(j<c)
{
temp[i*cols+j]=elems[i*(cols-1)+j];
}
if(j>=c)
{
temp[i*cols+j+1]=elems[i*(cols-1)+j];
}
}
}
if(elems!=0)
{
delete [] elems;
}
elems=new double[size];
for(i=0;i<size;i++)
{
elems[i]=temp[i];
}
delete [] temp;
setelem(0,c,dat);
}
double * CMatrix::getdatabuffer()
{
if(elems==NULL)
{
return NULL;
}
return elems;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -