?? matrix.cpp
字號:
PMATSET(1,1);
BACK;
}
if(lin>row||lin<=0||que>col||que<=0)
{
//指定的行列值對求基矩陣為效!
PMATSET(1,1);
BACK;
}
for(unsigned i=1;i<=row;i++)
{
for(unsigned j=1;j<=col;j++)
{
if(i==lin&&j==que)
{
if(!(pmat->Append(1)))
{
//無法分配堆內存以繼續生成基矩陣!
BACK;
}
}
else
{
if(!(pmat->Append(0)))
{
//無法分配堆內存以繼續生成基矩陣!
BACK;
}
}
}
}
BACK;
}
CMATRIX& CMATRIX::BASE(unsigned l/*=1*/,unsigned q/*=1*/,unsigned r/*=1*/,unsigned c/*=1*/)
{
TMPPMAT(r,c);
for(unsigned i=1;i<=r;i++)
{
for(unsigned j=1;j<=c;j++)
{
if(i==l&&j==q)
{
if(!(pmat->Append(1)))
{
//無法分配堆內存以繼續生成基矩陣!
BACK;
}
}
else
{
if(!(pmat->Append(0)))
{
//無法分配堆內存以繼續生成基矩陣!
BACK;
}
}
}
}
BACK;
}
int tao(CMATRIX& _v_)
{
if(_v_.Len()==0)
{
//序列為空!無法求逆序數!
return (-1);
}
if(_v_.Row()!=_v_.Len()&&_v_.Col()!=_v_.Len())
{
//矩陣求逆序數無定義!
return (_v_.Len()+1); //adjust the error according to this value
}
int t=0;
double dat;
for(unsigned i=1;i<=_v_.Len();i++)
{
dat=_v_.GetCell(i);
for(unsigned j=i;j<=_v_.Len();j++) { if(dat>_v_.GetCell(j)) t=t+1; }
}
return t;
}
CMATRIX& CMATRIX::Power(int pow)
{
TMPPMAT(row,col);
if(len==0)
{
//矩陣為空!無法求方陣的冪!
BACK;
}
*pmat=*this;
if(pow>0) for(int i=2;i<=pow;i++) { *pmat=(*pmat)*(*this); }
else
{
if(pow<0)
{
pow=(-1)*pow;
*pmat=inverse(*pmat);
for(int i=2;i<=pow;i++) { *pmat=(*pmat)*(*this); }
}
else pmat=&Identity();
//else *pmat=Identity();
}
BACK;
}
CMATRIX& CMATRIX::Zero()
{
TMPPMAT(row,col);
for(unsigned i=1;i<=row;i++)
{
for(unsigned j=1;j<=col;j++)
{
if(!(pmat->Append(0)))
{
//無法分配堆內存以繼續生成零矩陣!
BACK;
}
}
}
BACK;
}
CMATRIX& CMATRIX::ZERO(unsigned r, unsigned c)
{
TMPPMAT(r,c);
for(unsigned i=1;i<=r;i++)
{
for(unsigned j=1;j<=c;j++)
{
if(!(pmat->Append(0)))
{
//無法分配堆內存以繼續生成零矩陣!
BACK;
}
}
}
BACK;
}
CMATRIX& CMATRIX::Expand(CMATRIX& _m_,EXSTYLE exs/*=TOP*/,int excursion/*=0*/)
{
TMPPMAT(1,1);
if(len==0||_m_.Len()==0)
{
//矩陣為空!無法進行矩陣的擴展!
BACK;
}
int EXC=abs(excursion);
unsigned mr=_m_.Row();
unsigned mc=_m_.Col();
switch(exs)
{
case TOP:
EXPARA.ROW=mr+row;
if(excursion<=0)
{
if(mc>=col+EXC) EXPARA.COL=mc;
else EXPARA.COL=col+EXC;
EXPARA.r1=mr;EXPARA.c1=EXC;
EXPARA.r2=0;EXPARA.c2=0;
}
else
{
if(col>=mc+EXC) EXPARA.COL=col;
else EXPARA.COL=mc+EXC;
EXPARA.r1=mr;EXPARA.c1=0;
EXPARA.r2=0;EXPARA.c2=EXC;
}
break;
case BOTTOM:
EXPARA.ROW=mr+row;
if(excursion<=0)
{
if(mc>=col+EXC) EXPARA.COL=mc;
else EXPARA.COL=col+EXC;
EXPARA.r1=0;EXPARA.c1=EXC;
EXPARA.r2=row;EXPARA.c2=0;
}
else
{
if(col>=mc+EXC) EXPARA.COL=col;
else EXPARA.COL=mc+EXC;
EXPARA.r1=0;EXPARA.c1=0;
EXPARA.r2=row;EXPARA.c2=EXC;
}
break;
case LEFT:
EXPARA.COL=mc+col;
if(excursion<=0)
{
if(mr>=row+EXC) EXPARA.ROW=mr;
else EXPARA.ROW=row+EXC;
EXPARA.r1=mc;EXPARA.c1=EXC;
EXPARA.r2=0;EXPARA.c2=0;
}
else
{
if(row>=mr+EXC) EXPARA.ROW=row;
else EXPARA.ROW=mr+EXC;
EXPARA.r1=0;EXPARA.c1=mc;
EXPARA.r2=EXC;EXPARA.c2=0;
}
break;
case RIGHT:
EXPARA.COL=mc+col;
if(excursion<=0)
{
if(row>=mr+EXC) EXPARA.ROW=row;
else EXPARA.ROW=mr+EXC;
EXPARA.r1=col;EXPARA.c1=EXC;
EXPARA.r2=0;EXPARA.c2=0;
}
else
{
if(mr>=row+EXC) EXPARA.ROW=mr;
else EXPARA.ROW=row+EXC;
EXPARA.r1=0;EXPARA.c1=0;
EXPARA.r2=EXC;EXPARA.c2=mc;
}
break;
default:break;
}
double tmpdat=0;
// *pmat=CMATRIX::ZERO(EXPARA.ROW,EXPARA.COL);
pmat=&CMATRIX::ZERO(EXPARA.ROW,EXPARA.COL);
for(unsigned i=1;i<=EXPARA.ROW;i++)
{
for(unsigned j=1;j<=EXPARA.COL;j++)
{
if(i>EXPARA.r2 && i<=EXPARA.r2+mr && j>EXPARA.c2 && j<=mc+EXPARA.c2)
tmpdat=_m_(i-EXPARA.r2,j-EXPARA.c2);
else
{
if(i>EXPARA.r1 && i<=EXPARA.r1+row && j>EXPARA.c1 && j<=col+EXPARA.c1)
tmpdat=(*this)(i-EXPARA.r1,j-EXPARA.c1);
else tmpdat=0;
}
pmat->SetCell(i,j,tmpdat);
}
}
BACK;
}
double CMATRIX::Norm(DTYPE dtype/*=FROB*/)
{
unsigned i=1,j=1;
double d=0,tmpd=0;
switch(dtype)
{
case ONE:
{
TMPPMAT(col,1);
for(j=1;j<=col;j++)
{
for(i=1;i<=row;i++)
{
tmpd+=Cell(i,j);
}
pmat->Append(tmpd);
tmpd=0;
}
d=(pmat->Extremum()).extremum;
pmat->Destroy();
}
break;
case TWO:break;
case INF:
{
TMPPMAT(row,1);
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
tmpd+=Cell(i,j);
}
pmat->Append(tmpd);
tmpd=0;
}
d=(pmat->Extremum()).extremum;
pmat->Destroy();
}
break;
case FROB:
{
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
tmpd+=Cell(i,j)*Cell(i,j);
}
}
d=sqrt(tmpd);
}
break;
default:d=0;break;
}
return d;
}
bool CMATRIX::Swap(unsigned int r1, unsigned int c1, unsigned int r2, unsigned int c2)
{
double tmp=(*this)(r1,c1);
SetCell(r1,c1,(*this)(r2,c2));
SetCell(r2,c2,tmp);
return true;
}
void CMATRIX::InsSort(SORTYPE sortype)
{
if(sortype.IsCol==true)//對列排序
{
for(unsigned i=1;i<=row;i++)
{
for(unsigned j=i;j<=row;j++)
{
if(sortype.IsUp==true)//升序
{
if((*this)(i,sortype.wer)<(*this)(j,sortype.wer))
continue;
else
{
if(sortype.Syn==false)//無需同步
Swap(i,sortype.wer,j,sortype.wer);
else//需要同步
{
for(unsigned k=1;k<=col;k++)
Swap(i,k,j,k);
}
}
}
else//降序
{
if((*this)(i,sortype.wer)>(*this)(j,sortype.wer))
continue;
else
{
if(sortype.Syn==false)//無需同步
Swap(i,sortype.wer,j,sortype.wer);
else//需要同步
{
for(unsigned k=1;k<=col;k++)
Swap(i,k,j,k);
}
}
}
}
}
}
else
{
for(unsigned i=1;i<=col;i++)
{
for(unsigned j=i;j<=col;j++)
{
if(sortype.IsUp==true)//升序
{
if((*this)(sortype.wer,i)<(*this)(sortype.wer,j))
continue;
else
{
if(sortype.Syn==false)//無需同步
Swap(sortype.wer,i,sortype.wer,j);
else//需要同步
{
for(unsigned k=1;k<=col;k++)
Swap(k,i,k,j);
}
}
}
else//降序
{
if((*this)(sortype.wer,i)>(*this)(sortype.wer,j))
continue;
else
{
if(sortype.Syn==false)//無需同步
Swap(sortype.wer,i,sortype.wer,j);
else//需要同步
{
for(unsigned k=1;k<=col;k++)
Swap(k,i,k,j);
}
}
}
}
}
}
}
EXTREMUM CMATRIX::ExtremumW(bool isMax)
{
EXTREMUM res;
res.extremum=Cell(1,1);
if(isMax)
{
for(unsigned i=1;i<=row;i++)
{
for(unsigned j=1;j<=col;j++)
{
if(res.extremum<Cell(i,j))
{
res.extremum=Cell(i,j);
res.row=i;
res.col=j;
}
else continue;
}
}
}
else
{
for(unsigned i=1;i<=row;i++)
{
for(unsigned j=1;j<=col;j++)
{
if(res.extremum>Cell(i,j))
{
res.extremum=Cell(i,j);
res.row=i;
res.col=j;
}
else continue;
}
}
}
return res;
}
EXTREMUM CMATRIX::Extremum(bool isMax/*=true*/,unsigned num/*=1*/,bool isCol/*=true*/)
{
double tmpd=0;
EXTREMUM res;
if(isCol==true)
{
res.col=num;
tmpd=Cell(1,num);
if(isMax==true)
{
for(unsigned i=2;i<=row;i++)
{
if(tmpd<Cell(i,num))
{
tmpd=Cell(i,num);
res.row=i;
}
else continue;
}
}
else
{
for(unsigned i=2;i<=row;i++)
{
if(tmpd>Cell(i,num))
{
tmpd=Cell(i,num);
res.row=i;
}
else continue;
}
}
}
else
{
res.row=num;
tmpd=Cell(num,1);
if(isMax==true)
{
for(unsigned j=2;j<=col;j++)
{
if(tmpd<Cell(num,j))
{
tmpd=Cell(num,j);
res.col=j;
}
else continue;
}
}
else
{
for(unsigned j=2;j<=col;j++)
{
if(tmpd>Cell(num,j))
{
tmpd=Cell(num,j);
res.col=j;
}
else continue;
}
}
}
res.extremum=tmpd;
return res;
}
CMATRIX& arytomat(double ary[],unsigned n, unsigned r,unsigned c/*=1*/,bool isLeftRight/*=true*/)
{
TMPPMAT(r,c);
pmat=&(pmat->Zero());
// *pmat=(pmat->Zero());&
unsigned k=0;
if(isLeftRight)
{
for(unsigned i=1;i<=r;i++)
{
for(unsigned j=1;j<=c;j++)
{
if(k>=n) BACK;
pmat->SetCell(i,j,ary[k]);
k++;
}
}
}
else
{
for(unsigned j=1;j<=c;j++)
{
for(unsigned i=1;i<=r;i++)
{
if(k>=n) BACK;
pmat->SetCell(i,j,ary[k]);
k++;
}
}
}
BACK;
}
CMATRIX& Cos(CMATRIX &angles)
{
TMPPMAT(angles.Row(),angles.Col());
for(unsigned i=1;i<=angles.Row();i++)
{
for(unsigned j=1;j<=angles.Col();j++)
{
pmat->Append(Cos(ToRad(angles(i,j))));
}
}
BACK;
}
V3 V3::operator *(const V3 &a)
{
V3 v;
v.x1=x2*a.x3-x3*a.x2;
v.x2=x3*a.x1-x1*a.x3;
v.x3=x1*a.x2-x2*a.x1;
return v;
}
V3 V3::operator -(const V3 &a)
{
V3 v;
v.x1=x1-a.x1;
v.x2=x2-a.x2;
v.x3=x3-a.x3;
return v;
}
V3 V3::operator +(const V3 &a)
{
V3 v;
v.x1=x1+a.x1;
v.x2=x2+a.x2;
v.x3=x3+a.x3;
return v;
}
ostream& operator <<(ostream& output,CMATRIX& _m)
{
if(_m.Len()==0) cout<<"矩陣為空!將輸出唯一的默認元素!"<<endl;
int colcount=0;
for(_m.fence=_m.head;_m.fence;_m.fence=_m.fence->next)
{
output<<" "<<_m.fence->Cell()<<"\t";
colcount++;
if(colcount%_m.Col()==0) cout<<endl;
}
return output;
}
istream& operator >>(istream& in,CMATRIX& m_)
{
double temp;
for(unsigned i=1;i<=m_.Row();i++)
{
for(unsigned j=1;j<=m_.Col();j++)
{ in>>temp; m_.Append(temp); }
}
return in;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -