📄 newmat6.cpp
字号:
//$$ 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 + -