📄 intmat.cpp
字号:
IntMatrix commat(IntMatrix & m1,
IntVector & m2, int select)
{
int i,j,m,n;
int mrow1=m1.mrow();
int mcol1=m1.mcol();
int mrow2=m2.vlen();
switch(select)
{
case 1:
m=MAX(mrow1,mrow2);
n=mcol1+1;
break;
case 2:
m=mrow1+1;
n=MAX(mcol1,mrow2);
break;
default:
{
cout<<Merrorstring[EMAT_ASSIGNDATAERR];
throw Merrorstring[EMAT_ASSIGNDATAERR];
}
;
}
IntMatrix x(m,n);
for(i=0; i<mrow1; i++)
for(j=0; j<mcol1; j++)
x[i][j]=m1[i][j];
if(select==1){
for(i=0; i<mrow2; i++)
x[i][mcol1]=m2[i];
}
else{
for(j=0; j<mrow2; j++)
x[mrow1][j]=m2[j];
}
return x;
}
IntMatrix IntMatrix::commat(IntVector & m2,
int select)
{
return ::commat(*this,m2,select);
}
IntMatrix commat(IntVector & m1,
IntMatrix & m2, int select)
{
int i,j,m,n;
int mrow1=m1.vlen();
int mrow2=m2.mrow();
int mcol2=m2.mcol();
switch(select)
{
case 1:
m=MAX(mrow1,mrow2);
n=mcol2+1;
break;
case 2:
m=mrow2+1;
n=MAX(mrow1,mcol2);
break;
default:
{
cout<<Merrorstring[EMAT_ASSIGNDATAERR];
throw Merrorstring[EMAT_ASSIGNDATAERR];
}
;
}
IntMatrix x(m,n);
if(select==1){
for(i=0; i<mrow1; i++)
x[i][0]=m1[i];
for(i=0; i<mrow2; i++)
for(j=0; j<mcol2; j++)
x[i][j+1]=m2[i][j];
}
else{
for(j=0; j<mrow1; j++)
x[0][j]=m1[j];
for(i=0; i<mrow2; i++)
for(j=0; j<mcol2; j++)
x[i+1][j]=m2[i][j];
}
return x;
}
IntMatrix commat(IntVector & m1,
IntVector & m2, int select)
{
int i,m,n;
int mrow1=m1.vlen();
int mrow2=m2.vlen();
IntMatrix tmp;
switch(select)
{
case 1:
m=MAX(mrow1,mrow2);
n=2;
break;
case 2:
m=2;
n=MAX(mrow1,mrow2);
break;
default:
{
cout<<Merrorstring[EMAT_ASSIGNDATAERR];
throw Merrorstring[EMAT_ASSIGNDATAERR];
}
;
}
IntMatrix x(m,n);
if(select==1){
for(i=0; i<mrow1; i++)
x[i][0]=m1[i];
for(i=0; i<mrow2; i++)
x[i][1]=m2[i];
}
else{
for(i=0; i<mrow1; i++)
x[0][i]=m1[i];
for(i=0; i<mrow2; i++)
x[1][i]=m2[i];
}
return x;
}
IntMatrix commat(IntMatrix & m1,
IntMatrix & m2, int srow, int scol)
{
int i,j;
int mrow1=m1.mrow();
int mcol1=m1.mcol();
int mrow2=m2.mrow();
int mcol2=m2.mcol();
if((srow<mrow1)&&(scol<mcol1))
{
cout<<Merrorstring[EMAT_ASSIGNDATAERR];
throw Merrorstring[EMAT_ASSIGNDATAERR];
}
int mx=MAX(mrow1,srow+mrow2);
int my=MAX(mcol1,scol+mcol2);
IntMatrix x(mx,my);
for(i=0; i<mrow1; i++)
for(j=0; j<mcol1; j++)
x[i][j]=m1[i][j];
for(i=0; i<mrow2; i++)
for(j=0; j<mcol2; j++)
x[i+srow][j+scol]=m2[i][j];
return x;
}
IntMatrix IntMatrix::commat(IntMatrix & m2,
int srow, int scol)
{
return ::commat(*this,m2,srow,scol);
}
IntMatrix diag(IntVector & m2)
{
int n=vlen(m2);
IntMatrix x(n,n,0);
for(int i=0; i<n; i++)
x[i][i]=m2[i];
return x;
}
IntMatrix diag(IntVector & m2,int k)
{
int nn=vlen(m2);
int kk=abs(k);
int n=nn+kk;
IntMatrix x(n,n,0);
if(k>0){
for(int i=0; i<nn; i++)
x[i][i+k]=m2[i];
}
else
{
for(int i=kk; i<n; i++)
x[i][i-kk]=m2[i-kk];
}
return x;
}
IntVector diag(IntMatrix & m2)
{
int n=MIN(m2.mrow(),m2.mcol());
IntVector x(n);
for(int i=0; i<n; i++)
x[i]=m2[i][i];
return x;
}
IntVector IntMatrix::diag()
{
int n=MIN(mrow(),mcol());
IntVector x(n);
for(int i=0; i<n; i++)
x[i]=(*this)[i][i];
return x;
}
IntVector diag(IntMatrix & m2,int k)
{
int m=m2.mrow();
int n=m2.mcol();
int kk=abs(k);
int nn,i;
if( ((k>0)&&(k>(n-1)))||((k<0)&&(-k>(m-1))) )
{
cout<<Merrorstring[EMAT_ASSIGNDATAERR];
throw Merrorstring[EMAT_ASSIGNDATAERR];
}
if(m>=n){
if(k>=0)
nn=n-kk;
else if(n+kk<=m)
nn=n;
else
nn=m-kk;
}
else{
if(k>=0)
if(m+kk<=n)
nn=m;
else
nn=n-kk;
else
nn=m-kk;
}
IntVector x(nn);
if(k>0)
for(i=0; i<nn; i++)
x[i]=m2[i][i+kk];
else
for(i=0; i<nn; i++)
x[i]=m2[i+kk][i];
return x;
}
IntVector IntMatrix::diag(int k)
{
return ::diag(*this,k);
}
//returns the sum of every element in the same row of input IntMatrix.
IntVector sum(IntMatrix & m)
{
int nr=m.mrow();
IntVector x(nr);
for(int i=0; i<nr; i++)
x[i]=sum(m[i]);
return x;
}
IntVector IntMatrix::sum()
{
int nr=mrow();
IntVector x(nr);
for(int i=0; i<nr; i++)
x[i]=::sum((*this)[i]);
return x;
}
IntMatrix IntMatrix::trans()
{
//allocate the new IntMatrix<int>
int len=mrow();
int ven=mcol();
IntMatrix v(ven,len);
//do the operations
for(int i=0; i<ven; i++)
for(int j=0; j<len; j++)
v[i][j]=(*this)[j][i];
return v;
}
IntMatrix trans(IntMatrix & v1)
{
//allocate the new IntMatrix<int>
int len=v1.p->length;
int ven=vlen(v1.p->f[0]);
IntMatrix v(ven,len);
//do the operations
for(int i=0; i<ven; i++)
for(int j=0; j<len; j++)
v[i][j]=v1[j][i];
return v;
}
IntMatrix IntMatrix::abs()
{
int mrows=p->length;
int mcols=vlen(p->f[0]);
IntMatrix v(mrows,mcols);
for(int i=0; i<mrows; i++)
for(int j=0; j<mcols; j++)
v[i][j]=::abs((*this)[i][j]);
return v;
}
IntMatrix abs(IntMatrix & x)
{
int mrows=x.mrow();
int mcols=x.mcol();
IntMatrix v(mrows,mcols);
for(int i=0; i<mrows; i++)
for(int j=0; j<mcols; j++)
v[i][j]=abs(x[i][j]);
return v;
}
//returns a IntVector. if the i-th row has any non-zero element,the i-th element
//of return IntVector is 1. otherwise, it is 0.
IntVector any(IntMatrix & v)
{
int m=v.mrow();
int n=v.mcol();
IntVector x(m);
for(int i=0; i<m; i++){
x[i]=0;
for(int j=0; j<n; j++){
if(v[i][j] != 0){
x[i]=1;
break;
}
}
}
return x;
}
IntVector IntMatrix::any()
{
int m=mrow();
int n=mcol();
IntVector x(m);
for(int i=0; i<m; i++){
x[i]=0;
for(int j=0; j<n; j++){
if((*this)[i][j] != 0){
x[i]=1;
break;
}
}
}
return x;
}
IntVector maxofrow(IntMatrix & v)
{
IntVector xx;
xx=v.maxofrow();
return xx;
}
IntVector IntMatrix::maxofrow()
{
int nr=mrow();
int nc=mcol();
IntVector xx(nr);
for(int i=0; i<nr; i++){
xx[i]=(*this)[i][0];
for(int j=1; j<nc; j++)
if((*this)[i][j]>xx[i])
xx[i]=(*this)[i][j];
}
return xx;
}
IntVector maxofcol(IntMatrix & v)
{
IntVector xx;
xx=v.maxofcol();
return xx;
}
IntVector IntMatrix::maxofcol()
{
int nr=mrow();
int nc=mcol();
IntVector xx(nc);
for(int i=0; i<nc; i++){
xx[i]=(*this)[0][i];
for(int j=1; j<nr; j++)
if((*this)[j][i]>xx[i])
xx[i]=(*this)[j][i];
}
return xx;
}
//v=max(v1,v2): v[i][j]=max(v1[i][j],v2[i][j].
IntMatrix mmax(IntMatrix & v1,IntMatrix & v2)
{
int nr=v1.mrow();
int nc=v1.mcol();
if( (v2.mrow() !=nr) || (v2.mcol() !=nc) )
{
cout<<Merrorstring[EMAT_INVALIDORDER];
throw Merrorstring[EMAT_INVALIDORDER];
}
IntMatrix xx(nr,nc);
for(int i=0; i<nr; i++)
for(int j=0; j<nc; j++){
xx[i][j]=v1[i][j];
if(v2[i][j]>v1[i][j])
xx[i][j]=v2[i][j];
}
return xx;
}
IntMatrix IntMatrix::mmax(IntMatrix & v2)
{
int nr=mrow();
int nc=mcol();
if( (v2.mrow() !=nr) || (v2.mcol() !=nc) )
{
cout<<Merrorstring[EMAT_INVALIDORDER];
throw Merrorstring[EMAT_INVALIDORDER];
}
IntMatrix xx(nr,nc);
for(int i=0; i<nr; i++)
for(int j=0; j<nc; j++){
xx[i][j]=(*this)[i][j];
if(v2[i][j]>(*this)[i][j])
xx[i][j]=v2[i][j];
}
return xx;
}
IntVector minofrow(IntMatrix & v)
{
IntVector xx;
xx=v.minofrow();
return xx;
}
IntVector IntMatrix::minofrow()
{
int nr=mrow();
int nc=mcol();
IntVector xx(nr);
for(int i=0; i<nr; i++){
xx[i]=(*this)[i][0];
for(int j=1; j<nc; j++)
if((*this)[i][j]<xx[i])
xx[i]=(*this)[i][j];
}
return xx;
}
IntVector minofcol(IntMatrix & v)
{
IntVector xx;
xx=v.minofcol();
return xx;
}
IntVector IntMatrix::minofcol()
{
int nr=mrow();
int nc=mcol();
IntVector xx(nc);
for(int i=0; i<nc; i++){
xx[i]=(*this)[0][i];
for(int j=1; j<nr; j++)
if((*this)[j][i]<xx[i])
xx[i]=(*this)[j][i];
}
return xx;
}
//v=min(v1,v2): v[i][j]=min(v1[i][j],v2[i][j].
IntMatrix mmin(IntMatrix & v1,IntMatrix & v2)
{
int nr=v1.mrow();
int nc=v1.mcol();
if( (v2.mrow() !=nr) || (v2.mcol() !=nc) )
{
cout<<Merrorstring[EMAT_INVALIDORDER];
throw Merrorstring[EMAT_INVALIDORDER];
}
IntMatrix xx(nr,nc);
for(int i=0; i<nr; i++)
for(int j=0; j<nc; j++){
xx[i][j]=v1[i][j];
if(v2[i][j]<v1[i][j])
xx[i][j]=v2[i][j];
}
return xx;
}
IntMatrix IntMatrix::mmin(IntMatrix & v2)
{
int nr=mrow();
int nc=mcol();
if( (v2.mrow() !=nr) || (v2.mcol() !=nc) )
{
cout<<Merrorstring[EMAT_INVALIDORDER];
throw Merrorstring[EMAT_INVALIDORDER];
}
IntMatrix xx(nr,nc);
for(int i=0; i<nr; i++)
for(int j=0; j<nc; j++){
xx[i][j]=(*this)[i][j];
if(v2[i][j]<(*this)[i][j])
xx[i][j]=v2[i][j];
}
return xx;
}
IntMatrix eye(IntMatrix & v)
{
int m=v.mrow();
int n=v.mcol();
IntMatrix x(m,n);
int mn=MIN(m,n);
for(int i=0; i<mn; i++)
x[i][i]=1;
return x;
}
IntMatrix IntMatrix::eye()
{
int m=mrow();
int n=mcol();
IntMatrix x(m,n);
int mn=MIN(m,n);
for(int i=0; i<mn; i++)
x[i][i]=1;
return x;
}
void IntMatrix::matmult(IntVector& u,IntVector& v)
{
int m=u();
int n=v();
initial(m,n);
int* f1=u.p->f;
int* f2=v.p->f;
// IntVector **f=p->f;
for(int i=0;i<m;i++,f1++)
{
f2=v.p->f;
for(int j=0;j<n;j++,f2++)
// (*f)[j]=(*f1)*(*f2);
(*p->f[i])[j]=(*f1)*(*f2);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -