⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newmat6.cpp

📁 matrix library for linux and windos
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//$$ newmat6.cpp            Operators, element access, submatrices// Copyright (C) 1991,2,3,4: R B Davies#include "include.h"#include "newmat.h"#include "newmatrc.h"#ifdef use_namespacenamespace NEWMAT {#endif#ifdef DO_REPORT#define REPORT { static ExeCounter ExeCount(__LINE__,6); ++ExeCount; }#else#define REPORT {}#endif/*************************** general utilities *************************/static int tristore(int n)                      // els in triangular matrix{ return (n*(n+1))/2; }/****************************** operators *******************************/Real& Matrix::operator()(int m, int n){   REPORT   if (m<=0 || m>nrows || n<=0 || n>ncols)      Throw(IndexException(m,n,*this));   return store[(m-1)*ncols+n-1];}Real& SymmetricMatrix::operator()(int m, int n){   REPORT   if (m<=0 || n<=0 || m>nrows || n>ncols)      Throw(IndexException(m,n,*this));   if (m>=n) return store[tristore(m-1)+n-1];   else return store[tristore(n-1)+m-1];}Real& UpperTriangularMatrix::operator()(int m, int n){   REPORT   if (m<=0 || n<m || n>ncols)      Throw(IndexException(m,n,*this));   return store[(m-1)*ncols+n-1-tristore(m-1)];}Real& LowerTriangularMatrix::operator()(int m, int n){   REPORT   if (n<=0 || m<n || m>nrows)      Throw(IndexException(m,n,*this));   return store[tristore(m-1)+n-1];}Real& DiagonalMatrix::operator()(int m, int n){   REPORT   if (n<=0 || m!=n || m>nrows || n>ncols)      Throw(IndexException(m,n,*this));   return store[n-1];}Real& DiagonalMatrix::operator()(int m){   REPORT   if (m<=0 || m>nrows) Throw(IndexException(m,*this));   return store[m-1];}Real& ColumnVector::operator()(int m){   REPORT   if (m<=0 || m> nrows) Throw(IndexException(m,*this));   return store[m-1];}Real& RowVector::operator()(int n){   REPORT   if (n<=0 || n> ncols) Throw(IndexException(n,*this));   return store[n-1];}Real& BandMatrix::operator()(int m, int n){   REPORT   int w = upper+lower+1; int i = lower+n-m;   if (m<=0 || m>nrows || n<=0 || n>ncols || i<0 || i>=w)      Throw(IndexException(m,n,*this));   return store[w*(m-1)+i];}Real& UpperBandMatrix::operator()(int m, int n){   REPORT   int w = upper+1; int i = n-m;   if (m<=0 || m>nrows || n<=0 || n>ncols || i<0 || i>=w)      Throw(IndexException(m,n,*this));   return store[w*(m-1)+i];}Real& LowerBandMatrix::operator()(int m, int n){   REPORT   int w = lower+1; int i = lower+n-m;   if (m<=0 || m>nrows || n<=0 || n>ncols || i<0 || i>=w)      Throw(IndexException(m,n,*this));   return store[w*(m-1)+i];}Real& SymmetricBandMatrix::operator()(int m, int n){   REPORT   int w = lower+1;   if (m>=n)   {      REPORT      int i = lower+n-m;      if ( m>nrows || n<=0 || i<0 )         Throw(IndexException(m,n,*this));      return store[w*(m-1)+i];   }   else   {      REPORT      int i = lower+m-n;      if ( n>nrows || m<=0 || i<0 )         Throw(IndexException(m,n,*this));      return store[w*(n-1)+i];   }}Real Matrix::operator()(int m, int n) const{   REPORT   if (m<=0 || m>nrows || n<=0 || n>ncols)      Throw(IndexException(m,n,*this));   return store[(m-1)*ncols+n-1];}Real SymmetricMatrix::operator()(int m, int n) const{   REPORT   if (m<=0 || n<=0 || m>nrows || n>ncols)      Throw(IndexException(m,n,*this));   if (m>=n) return store[tristore(m-1)+n-1];   else return store[tristore(n-1)+m-1];}Real UpperTriangularMatrix::operator()(int m, int n) const{   REPORT   if (m<=0 || n<m || n>ncols)      Throw(IndexException(m,n,*this));   return store[(m-1)*ncols+n-1-tristore(m-1)];}Real LowerTriangularMatrix::operator()(int m, int n) const{   REPORT   if (n<=0 || m<n || m>nrows)      Throw(IndexException(m,n,*this));   return store[tristore(m-1)+n-1];}Real DiagonalMatrix::operator()(int m, int n) const{   REPORT   if (n<=0 || m!=n || m>nrows || n>ncols)      Throw(IndexException(m,n,*this));   return store[n-1];}Real DiagonalMatrix::operator()(int m) const{   REPORT   if (m<=0 || m>nrows) Throw(IndexException(m,*this));   return store[m-1];}Real ColumnVector::operator()(int m) const{   REPORT   if (m<=0 || m> nrows) Throw(IndexException(m,*this));   return store[m-1];}Real RowVector::operator()(int n) const{   REPORT   if (n<=0 || n> ncols) Throw(IndexException(n,*this));   return store[n-1];}Real BandMatrix::operator()(int m, int n) const{   REPORT   int w = upper+lower+1; int i = lower+n-m;   if (m<=0 || m>nrows || n<=0 || n>ncols || i<0 || i>=w)      Throw(IndexException(m,n,*this));   return store[w*(m-1)+i];}Real UpperBandMatrix::operator()(int m, int n) const{   REPORT   int w = upper+1; int i = n-m;   if (m<=0 || m>nrows || n<=0 || n>ncols || i<0 || i>=w)      Throw(IndexException(m,n,*this));   return store[w*(m-1)+i];}Real LowerBandMatrix::operator()(int m, int n) const{   REPORT   int w = lower+1; int i = lower+n-m;   if (m<=0 || m>nrows || n<=0 || n>ncols || i<0 || i>=w)      Throw(IndexException(m,n,*this));   return store[w*(m-1)+i];}Real SymmetricBandMatrix::operator()(int m, int n) const{   REPORT   int w = lower+1;   if (m>=n)   {      REPORT      int i = lower+n-m;      if ( m>nrows || n<=0 || i<0 )         Throw(IndexException(m,n,*this));      return store[w*(m-1)+i];   }   else   {      REPORT      int i = lower+m-n;      if ( n>nrows || m<=0 || i<0 )         Throw(IndexException(m,n,*this));      return store[w*(n-1)+i];   }}Real BaseMatrix::AsScalar() const{   REPORT   GeneralMatrix* gm = ((BaseMatrix&)*this).Evaluate();   if (gm->nrows!=1 || gm->ncols!=1)   {      Tracer tr("AsScalar");      Try         { Throw(ProgramException("Cannot convert to scalar", *gm)); }      CatchAll { gm->tDelete(); ReThrow; }   }   Real x = *(gm->store); gm->tDelete(); return x;}#ifdef TEMPS_DESTROYED_QUICKLYAddedMatrix& BaseMatrix::operator+(const BaseMatrix& bm) const{   REPORT   AddedMatrix* x = new AddedMatrix(this, &bm);   MatrixErrorNoSpace(x);   return *x;}SPMatrix& SP(const BaseMatrix& bm1,const BaseMatrix& bm2){   REPORT   SPMatrix* x = new SPMatrix(&bm1, &bm2);   MatrixErrorNoSpace(x);   return *x;}KPMatrix& KP(const BaseMatrix& bm1,const BaseMatrix& bm2){   REPORT   KPMatrix* x = new KPMatrix(&bm1, &bm2);   MatrixErrorNoSpace(x);   return *x;}MultipliedMatrix& BaseMatrix::operator*(const BaseMatrix& bm) const{   REPORT   MultipliedMatrix* x = new MultipliedMatrix(this, &bm);   MatrixErrorNoSpace(x);   return *x;}ConcatenatedMatrix& BaseMatrix::operator|(const BaseMatrix& bm) const{   REPORT   ConcatenatedMatrix* x = new ConcatenatedMatrix(this, &bm);   MatrixErrorNoSpace(x);   return *x;}StackedMatrix& BaseMatrix::operator&(const BaseMatrix& bm) const{   REPORT   StackedMatrix* x = new StackedMatrix(this, &bm);   MatrixErrorNoSpace(x);   return *x;}//SolvedMatrix& InvertedMatrix::operator*(const BaseMatrix& bmx) constSolvedMatrix& InvertedMatrix::operator*(const BaseMatrix& bmx){   REPORT   SolvedMatrix* x;   Try { x = new SolvedMatrix(bm, &bmx); MatrixErrorNoSpace(x); }   CatchAll { delete this; ReThrow; }   delete this;                // since we are using bm rather than this   return *x;}SubtractedMatrix& BaseMatrix::operator-(const BaseMatrix& bm) const{   REPORT   SubtractedMatrix* x = new SubtractedMatrix(this, &bm);   MatrixErrorNoSpace(x);   return *x;}ShiftedMatrix& BaseMatrix::operator+(Real f) const{   REPORT   ShiftedMatrix* x = new ShiftedMatrix(this, f);   MatrixErrorNoSpace(x);   return *x;}NegShiftedMatrix& operator-(Real f,const BaseMatrix& bm1){   REPORT   NegShiftedMatrix* x = new NegShiftedMatrix(f, &bm1);   MatrixErrorNoSpace(x);   return *x;}ScaledMatrix& BaseMatrix::operator*(Real f) const{   REPORT   ScaledMatrix* x = new ScaledMatrix(this, f);   MatrixErrorNoSpace(x);   return *x;}ScaledMatrix& BaseMatrix::operator/(Real f) const{   REPORT   ScaledMatrix* x = new ScaledMatrix(this, 1.0/f);   MatrixErrorNoSpace(x);   return *x;}ShiftedMatrix& BaseMatrix::operator-(Real f) const{   REPORT   ShiftedMatrix* x = new ShiftedMatrix(this, -f);   MatrixErrorNoSpace(x);   return *x;}TransposedMatrix& BaseMatrix::t() const{   REPORT   TransposedMatrix* x = new TransposedMatrix(this);   MatrixErrorNoSpace(x);   return *x;}NegatedMatrix& BaseMatrix::operator-() const{   REPORT   NegatedMatrix* x = new NegatedMatrix(this);   MatrixErrorNoSpace(x);   return *x;}ReversedMatrix& BaseMatrix::Reverse() const{   REPORT   ReversedMatrix* x = new ReversedMatrix(this);   MatrixErrorNoSpace(x);   return *x;}InvertedMatrix& BaseMatrix::i() const{   REPORT   InvertedMatrix* x = new InvertedMatrix(this);   MatrixErrorNoSpace(x);   return *x;}RowedMatrix& BaseMatrix::AsRow() const{   REPORT   RowedMatrix* x = new RowedMatrix(this);   MatrixErrorNoSpace(x);   return *x;}ColedMatrix& BaseMatrix::AsColumn() const{   REPORT   ColedMatrix* x = new ColedMatrix(this);   MatrixErrorNoSpace(x);   return *x;}DiagedMatrix& BaseMatrix::AsDiagonal() const{   REPORT   DiagedMatrix* x = new DiagedMatrix(this);   MatrixErrorNoSpace(x);   return *x;}MatedMatrix& BaseMatrix::AsMatrix(int nrx, int ncx) const{   REPORT   MatedMatrix* x = new MatedMatrix(this,nrx,ncx);   MatrixErrorNoSpace(x);   return *x;}#elseAddedMatrix BaseMatrix::operator+(const BaseMatrix& bm) const{ REPORT return AddedMatrix(this, &bm); }SPMatrix SP(const BaseMatrix& bm1,const BaseMatrix& bm2){ REPORT return SPMatrix(&bm1, &bm2); }KPMatrix KP(const BaseMatrix& bm1,const BaseMatrix& bm2){ REPORT return KPMatrix(&bm1, &bm2); }MultipliedMatrix BaseMatrix::operator*(const BaseMatrix& bm) const{ REPORT return MultipliedMatrix(this, &bm); }ConcatenatedMatrix BaseMatrix::operator|(const BaseMatrix& bm) const{ REPORT return ConcatenatedMatrix(this, &bm); }StackedMatrix BaseMatrix::operator&(const BaseMatrix& bm) const{ REPORT return StackedMatrix(this, &bm); }SolvedMatrix InvertedMatrix::operator*(const BaseMatrix& bmx) const{ REPORT return SolvedMatrix(bm, &bmx); }SubtractedMatrix BaseMatrix::operator-(const BaseMatrix& bm) const{ REPORT return SubtractedMatrix(this, &bm); }ShiftedMatrix BaseMatrix::operator+(Real f) const{ REPORT return ShiftedMatrix(this, f); }NegShiftedMatrix operator-(Real f, const BaseMatrix& bm){ REPORT return NegShiftedMatrix(f, &bm); }ScaledMatrix BaseMatrix::operator*(Real f) const{ REPORT return ScaledMatrix(this, f); }ScaledMatrix BaseMatrix::operator/(Real f) const{ REPORT return ScaledMatrix(this, 1.0/f); }ShiftedMatrix BaseMatrix::operator-(Real f) const{ REPORT return ShiftedMatrix(this, -f); }TransposedMatrix BaseMatrix::t() const{ REPORT return TransposedMatrix(this); }NegatedMatrix BaseMatrix::operator-() const{ REPORT return NegatedMatrix(this); }ReversedMatrix BaseMatrix::Reverse() const{ REPORT return ReversedMatrix(this); }InvertedMatrix BaseMatrix::i() const{ REPORT return InvertedMatrix(this); }RowedMatrix BaseMatrix::AsRow() const{ REPORT return RowedMatrix(this); }ColedMatrix BaseMatrix::AsColumn() const{ REPORT return ColedMatrix(this); }DiagedMatrix BaseMatrix::AsDiagonal() const{ REPORT return DiagedMatrix(this); }MatedMatrix BaseMatrix::AsMatrix(int nrx, int ncx) const{ REPORT return MatedMatrix(this,nrx,ncx); }#endifvoid GeneralMatrix::operator=(Real f){ REPORT int i=storage; Real* s=store; while (i--) { *s++ = f; } }void Matrix::operator=(const BaseMatrix& X){   REPORT //CheckConversion(X);   // MatrixConversionCheck mcc;   Eq(X,MatrixType::Rt);} void RowVector::operator=(const BaseMatrix& X){   REPORT  // CheckConversion(X);   // MatrixConversionCheck mcc;   Eq(X,MatrixType::RV);   if (nrows!=1)      { Tracer tr("RowVector(=)"); Throw(VectorException(*this)); }}void ColumnVector::operator=(const BaseMatrix& X){   REPORT //CheckConversion(X);   // MatrixConversionCheck mcc;   Eq(X,MatrixType::CV);   if (ncols!=1)      { Tracer tr("ColumnVector(=)"); Throw(VectorException(*this)); }}void SymmetricMatrix::operator=(const BaseMatrix& X){   REPORT // CheckConversion(X);   // MatrixConversionCheck mcc;   Eq(X,MatrixType::Sm);}void UpperTriangularMatrix::operator=(const BaseMatrix& X){   REPORT //CheckConversion(X);   // MatrixConversionCheck mcc;   Eq(X,MatrixType::UT);}void LowerTriangularMatrix::operator=(const BaseMatrix& X){   REPORT //CheckConversion(X);   // MatrixConversionCheck mcc;   Eq(X,MatrixType::LT);}void DiagonalMatrix::operator=(const BaseMatrix& X){   REPORT // CheckConversion(X);   // MatrixConversionCheck mcc;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -