📄 newmat6.cpp
字号:
void GeneralMatrix::operator<<(const int* r)
{
REPORT
int i = storage; Real* s=store;
while(i--) *s++ = (Real)*r++;
}
void GenericMatrix::operator=(const GenericMatrix& bmx)
{
if (&bmx != this) { REPORT if (gm) delete gm; gm = bmx.gm->Image();}
else { REPORT }
gm->Protect();
}
void GenericMatrix::operator=(const BaseMatrix& bmx)
{
if (gm)
{
int counter=bmx.search(gm);
if (counter==0) { REPORT delete gm; gm=0; }
else { REPORT gm->Release(counter); }
}
else { REPORT }
GeneralMatrix* gmx = ((BaseMatrix&)bmx).Evaluate();
if (gmx != gm) { REPORT if (gm) delete gm; gm = gmx->Image(); }
else { REPORT }
gm->Protect();
}
/*************************** += etc ***************************************/
// GeneralMatrix operators
void GeneralMatrix::operator+=(const BaseMatrix& X)
{
REPORT
Tracer tr("GeneralMatrix::operator+=");
// MatrixConversionCheck mcc;
Protect(); // so it cannot get deleted
// during Evaluate
GeneralMatrix* gm = ((BaseMatrix&)X).Evaluate();
AddedMatrix am(this,gm);
if (gm==this) Release(2); else Release();
Eq2(am,type());
}
void GeneralMatrix::operator-=(const BaseMatrix& X)
{
REPORT
Tracer tr("GeneralMatrix::operator-=");
// MatrixConversionCheck mcc;
Protect(); // so it cannot get deleted
// during Evaluate
GeneralMatrix* gm = ((BaseMatrix&)X).Evaluate();
SubtractedMatrix am(this,gm);
if (gm==this) Release(2); else Release();
Eq2(am,type());
}
void GeneralMatrix::operator*=(const BaseMatrix& X)
{
REPORT
Tracer tr("GeneralMatrix::operator*=");
// MatrixConversionCheck mcc;
Protect(); // so it cannot get deleted
// during Evaluate
GeneralMatrix* gm = ((BaseMatrix&)X).Evaluate();
MultipliedMatrix am(this,gm);
if (gm==this) Release(2); else Release();
Eq2(am,type());
}
void GeneralMatrix::operator|=(const BaseMatrix& X)
{
REPORT
Tracer tr("GeneralMatrix::operator|=");
// MatrixConversionCheck mcc;
Protect(); // so it cannot get deleted
// during Evaluate
GeneralMatrix* gm = ((BaseMatrix&)X).Evaluate();
ConcatenatedMatrix am(this,gm);
if (gm==this) Release(2); else Release();
Eq2(am,type());
}
void GeneralMatrix::operator&=(const BaseMatrix& X)
{
REPORT
Tracer tr("GeneralMatrix::operator&=");
// MatrixConversionCheck mcc;
Protect(); // so it cannot get deleted
// during Evaluate
GeneralMatrix* gm = ((BaseMatrix&)X).Evaluate();
StackedMatrix am(this,gm);
if (gm==this) Release(2); else Release();
Eq2(am,type());
}
void GeneralMatrix::operator+=(Real r)
{
REPORT
Tracer tr("GeneralMatrix::operator+=(Real)");
// MatrixConversionCheck mcc;
ShiftedMatrix am(this,r);
Release(); Eq2(am,type());
}
void GeneralMatrix::operator*=(Real r)
{
REPORT
Tracer tr("GeneralMatrix::operator*=(Real)");
// MatrixConversionCheck mcc;
ScaledMatrix am(this,r);
Release(); Eq2(am,type());
}
// Generic matrix operators
void GenericMatrix::operator+=(const BaseMatrix& X)
{
REPORT
Tracer tr("GenericMatrix::operator+=");
if (!gm) Throw(ProgramException("GenericMatrix is null"));
gm->Protect(); // so it cannot get deleted during Evaluate
GeneralMatrix* gmx = ((BaseMatrix&)X).Evaluate();
AddedMatrix am(gm,gmx);
if (gmx==gm) gm->Release(2); else gm->Release();
GeneralMatrix* gmy = am.Evaluate();
if (gmy != gm) { REPORT delete gm; gm = gmy->Image(); }
else { REPORT }
gm->Protect();
}
void GenericMatrix::operator-=(const BaseMatrix& X)
{
REPORT
Tracer tr("GenericMatrix::operator-=");
if (!gm) Throw(ProgramException("GenericMatrix is null"));
gm->Protect(); // so it cannot get deleted during Evaluate
GeneralMatrix* gmx = ((BaseMatrix&)X).Evaluate();
SubtractedMatrix am(gm,gmx);
if (gmx==gm) gm->Release(2); else gm->Release();
GeneralMatrix* gmy = am.Evaluate();
if (gmy != gm) { REPORT delete gm; gm = gmy->Image(); }
else { REPORT }
gm->Protect();
}
void GenericMatrix::operator*=(const BaseMatrix& X)
{
REPORT
Tracer tr("GenericMatrix::operator*=");
if (!gm) Throw(ProgramException("GenericMatrix is null"));
gm->Protect(); // so it cannot get deleted during Evaluate
GeneralMatrix* gmx = ((BaseMatrix&)X).Evaluate();
MultipliedMatrix am(gm,gmx);
if (gmx==gm) gm->Release(2); else gm->Release();
GeneralMatrix* gmy = am.Evaluate();
if (gmy != gm) { REPORT delete gm; gm = gmy->Image(); }
else { REPORT }
gm->Protect();
}
void GenericMatrix::operator|=(const BaseMatrix& X)
{
REPORT
Tracer tr("GenericMatrix::operator|=");
if (!gm) Throw(ProgramException("GenericMatrix is null"));
gm->Protect(); // so it cannot get deleted during Evaluate
GeneralMatrix* gmx = ((BaseMatrix&)X).Evaluate();
ConcatenatedMatrix am(gm,gmx);
if (gmx==gm) gm->Release(2); else gm->Release();
GeneralMatrix* gmy = am.Evaluate();
if (gmy != gm) { REPORT delete gm; gm = gmy->Image(); }
else { REPORT }
gm->Protect();
}
void GenericMatrix::operator&=(const BaseMatrix& X)
{
REPORT
Tracer tr("GenericMatrix::operator&=");
if (!gm) Throw(ProgramException("GenericMatrix is null"));
gm->Protect(); // so it cannot get deleted during Evaluate
GeneralMatrix* gmx = ((BaseMatrix&)X).Evaluate();
StackedMatrix am(gm,gmx);
if (gmx==gm) gm->Release(2); else gm->Release();
GeneralMatrix* gmy = am.Evaluate();
if (gmy != gm) { REPORT delete gm; gm = gmy->Image(); }
else { REPORT }
gm->Protect();
}
void GenericMatrix::operator+=(Real r)
{
REPORT
Tracer tr("GenericMatrix::operator+= (Real)");
if (!gm) Throw(ProgramException("GenericMatrix is null"));
ShiftedMatrix am(gm,r);
gm->Release();
GeneralMatrix* gmy = am.Evaluate();
if (gmy != gm) { REPORT delete gm; gm = gmy->Image(); }
else { REPORT }
gm->Protect();
}
void GenericMatrix::operator*=(Real r)
{
REPORT
Tracer tr("GenericMatrix::operator*= (Real)");
if (!gm) Throw(ProgramException("GenericMatrix is null"));
ScaledMatrix am(gm,r);
gm->Release();
GeneralMatrix* gmy = am.Evaluate();
if (gmy != gm) { REPORT delete gm; gm = gmy->Image(); }
else { REPORT }
gm->Protect();
}
/************************* element access *********************************/
Real& Matrix::element(int m, int n)
{
REPORT
if (m<0 || m>= nrows_val || n<0 || n>= ncols_val)
Throw(IndexException(m,n,*this,true));
return store[m*ncols_val+n];
}
Real Matrix::element(int m, int n) const
{
REPORT
if (m<0 || m>= nrows_val || n<0 || n>= ncols_val)
Throw(IndexException(m,n,*this,true));
return store[m*ncols_val+n];
}
Real& SymmetricMatrix::element(int m, int n)
{
REPORT
if (m<0 || n<0 || m >= nrows_val || n>=ncols_val)
Throw(IndexException(m,n,*this,true));
if (m>=n) return store[tristore(m)+n];
else return store[tristore(n)+m];
}
Real SymmetricMatrix::element(int m, int n) const
{
REPORT
if (m<0 || n<0 || m >= nrows_val || n>=ncols_val)
Throw(IndexException(m,n,*this,true));
if (m>=n) return store[tristore(m)+n];
else return store[tristore(n)+m];
}
Real& UpperTriangularMatrix::element(int m, int n)
{
REPORT
if (m<0 || n<m || n>=ncols_val)
Throw(IndexException(m,n,*this,true));
return store[m*ncols_val+n-tristore(m)];
}
Real UpperTriangularMatrix::element(int m, int n) const
{
REPORT
if (m<0 || n<m || n>=ncols_val)
Throw(IndexException(m,n,*this,true));
return store[m*ncols_val+n-tristore(m)];
}
Real& LowerTriangularMatrix::element(int m, int n)
{
REPORT
if (n<0 || m<n || m>=nrows_val)
Throw(IndexException(m,n,*this,true));
return store[tristore(m)+n];
}
Real LowerTriangularMatrix::element(int m, int n) const
{
REPORT
if (n<0 || m<n || m>=nrows_val)
Throw(IndexException(m,n,*this,true));
return store[tristore(m)+n];
}
Real& DiagonalMatrix::element(int m, int n)
{
REPORT
if (n<0 || m!=n || m>=nrows_val || n>=ncols_val)
Throw(IndexException(m,n,*this,true));
return store[n];
}
Real DiagonalMatrix::element(int m, int n) const
{
REPORT
if (n<0 || m!=n || m>=nrows_val || n>=ncols_val)
Throw(IndexException(m,n,*this,true));
return store[n];
}
Real& DiagonalMatrix::element(int m)
{
REPORT
if (m<0 || m>=nrows_val) Throw(IndexException(m,*this,true));
return store[m];
}
Real DiagonalMatrix::element(int m) const
{
REPORT
if (m<0 || m>=nrows_val) Throw(IndexException(m,*this,true));
return store[m];
}
Real& ColumnVector::element(int m)
{
REPORT
if (m<0 || m>= nrows_val) Throw(IndexException(m,*this,true));
return store[m];
}
Real ColumnVector::element(int m) const
{
REPORT
if (m<0 || m>= nrows_val) Throw(IndexException(m,*this,true));
return store[m];
}
Real& RowVector::element(int n)
{
REPORT
if (n<0 || n>= ncols_val) Throw(IndexException(n,*this,true));
return store[n];
}
Real RowVector::element(int n) const
{
REPORT
if (n<0 || n>= ncols_val) Throw(IndexException(n,*this,true));
return store[n];
}
Real& BandMatrix::element(int m, int n)
{
REPORT
int w = upper_val+lower_val+1; int i = lower_val+n-m;
if (m<0 || m>= nrows_val || n<0 || n>= ncols_val || i<0 || i>=w)
Throw(IndexException(m,n,*this,true));
return store[w*m+i];
}
Real BandMatrix::element(int m, int n) const
{
REPORT
int w = upper_val+lower_val+1; int i = lower_val+n-m;
if (m<0 || m>= nrows_val || n<0 || n>= ncols_val || i<0 || i>=w)
Throw(IndexException(m,n,*this,true));
return store[w*m+i];
}
Real& UpperBandMatrix::element(int m, int n)
{
REPORT
int w = upper_val+1; int i = n-m;
if (m<0 || m>= nrows_val || n<0 || n>= ncols_val || i<0 || i>=w)
Throw(IndexException(m,n,*this,true));
return store[w*m+i];
}
Real UpperBandMatrix::element(int m, int n) const
{
REPORT
int w = upper_val+1; int i = n-m;
if (m<0 || m>= nrows_val || n<0 || n>= ncols_val || i<0 || i>=w)
Throw(IndexException(m,n,*this,true));
return store[w*m+i];
}
Real& LowerBandMatrix::element(int m, int n)
{
REPORT
int w = lower_val+1; int i = lower_val+n-m;
if (m<0 || m>= nrows_val || n<0 || n>= ncols_val || i<0 || i>=w)
Throw(IndexException(m,n,*this,true));
return store[w*m+i];
}
Real LowerBandMatrix::element(int m, int n) const
{
REPORT
int w = lower_val+1; int i = lower_val+n-m;
if (m<0 || m>= nrows_val || n<0 || n>= ncols_val || i<0 || i>=w)
Throw(IndexException(m,n,*this,true));
return store[w*m+i];
}
Real& SymmetricBandMatrix::element(int m, int n)
{
REPORT
int w = lower_val+1;
if (m>=n)
{
REPORT
int i = lower_val+n-m;
if ( m>=nrows_val || n<0 || i<0 )
Throw(IndexException(m,n,*this,true));
return store[w*m+i];
}
else
{
REPORT
int i = lower_val+m-n;
if ( n>=nrows_val || m<0 || i<0 )
Throw(IndexException(m,n,*this,true));
return store[w*n+i];
}
}
Real SymmetricBandMatrix::element(int m, int n) const
{
REPORT
int w = lower_val+1;
if (m>=n)
{
REPORT
int i = lower_val+n-m;
if ( m>=nrows_val || n<0 || i<0 )
Throw(IndexException(m,n,*this,true));
return store[w*m+i];
}
else
{
REPORT
int i = lower_val+m-n;
if ( n>=nrows_val || m<0 || i<0 )
Throw(IndexException(m,n,*this,true));
return store[w*n+i];
}
}
#ifdef use_namespace
}
#endif
///}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -