📄 abstract.cc
字号:
// ioff += i; } convert(v); delete[] v;}voidSymmSCMatrix::convert(double**a) const{ int i; int j; int nr; nr = n(); for (i=0; i<nr; i++) { for (j=0; j<=i; j++) { a[i][j] = get_element(i,j); } }}voidSymmSCMatrix::scale(double a){ Ref<SCElementOp> op = new SCElementScale(a); this->element_op(op);}voidSymmSCMatrix::scale_diagonal(double a){ Ref<SCElementOp> op = new SCElementScaleDiagonal(a); this->element_op(op);}voidSymmSCMatrix::shift_diagonal(double a){ Ref<SCElementOp> op = new SCElementShiftDiagonal(a); this->element_op(op);}voidSymmSCMatrix::unit(){ this->assign(0.0); this->shift_diagonal(1.0);}voidSymmSCMatrix::assign_s(SymmSCMatrix*a){ this->assign(0.0); this->accumulate(a);}voidSymmSCMatrix::print(ostream&o) const{ vprint(0, o, 10);}voidSymmSCMatrix::print(const char *t, ostream&o, int i) const{ vprint(t, o, i);}voidSymmSCMatrix::vprint(const char* title, ostream& out, int i) const{ RefSCMatrix m = kit()->matrix(dim(),dim()); m->assign(0.0); m->accumulate(this); m->print(title, out, i);}SymmSCMatrix*SymmSCMatrix::clone(){ return kit()->symmmatrix(dim());}SymmSCMatrix*SymmSCMatrix::copy(){ SymmSCMatrix* result = clone(); result->assign(this); return result;}voidSymmSCMatrix::accumulate_symmetric_product(SCMatrix *a){ RefSCMatrix at = a->copy(); at->transpose_this(); RefSCMatrix m = kit()->matrix(a->rowdim(),a->rowdim()); m->assign(0.0); m->accumulate_product(a, at.pointer()); scale(2.0); accumulate_symmetric_sum(m.pointer()); scale(0.5);}voidSymmSCMatrix::accumulate_transform(SCMatrix *a, SymmSCMatrix *b, SCMatrix::Transform t){ RefSCMatrix brect = kit()->matrix(b->dim(),b->dim()); brect->assign(0.0); brect->accumulate(b); RefSCMatrix res; if (t == SCMatrix::TransposeTransform) { RefSCMatrix at = a->copy(); at->transpose_this(); RefSCMatrix tmp = at->clone(); tmp->assign(0.0); tmp->accumulate_product(at.pointer(), brect.pointer()); brect = 0; at = 0; res = kit()->matrix(dim(),dim()); res->assign(0.0); res->accumulate_product(tmp.pointer(), a); } else { RefSCMatrix tmp = a->clone(); tmp->assign(0.0); tmp->accumulate_product(a,brect); brect = 0; RefSCMatrix at = a->copy(); at->transpose_this(); res = kit()->matrix(dim(),dim()); res->assign(0.0); res->accumulate_product(tmp.pointer(), at.pointer()); at = 0; } scale(2.0); accumulate_symmetric_sum(res.pointer()); scale(0.5);}voidSymmSCMatrix::accumulate_transform(SCMatrix *a, DiagSCMatrix *b, SCMatrix::Transform t){ RefSCMatrix m = kit()->matrix(a->rowdim(),a->rowdim()); RefSCMatrix brect = kit()->matrix(b->dim(),b->dim()); brect->assign(0.0); brect->accumulate(b); RefSCMatrix tmp = a->clone(); tmp->assign(0.0); RefSCMatrix res; if (t == SCMatrix::TransposeTransform) { RefSCMatrix at = a->copy(); at->transpose_this(); tmp->accumulate_product(at.pointer(), brect.pointer()); brect = 0; at = 0; res = kit()->matrix(dim(),dim()); res->assign(0.0); res->accumulate_product(tmp.pointer(), a); } else { tmp->accumulate_product(a, brect.pointer()); brect = 0; RefSCMatrix at = a->copy(); at->transpose_this(); res = kit()->matrix(dim(),dim()); res->assign(0.0); res->accumulate_product(tmp.pointer(), at.pointer()); at = 0; } tmp = 0; scale(2.0); accumulate_symmetric_sum(res.pointer()); scale(0.5);}voidSymmSCMatrix::accumulate_transform(SymmSCMatrix *a, SymmSCMatrix *b){ RefSCMatrix m = kit()->matrix(a->dim(),a->dim()); m->assign(0.0); m->accumulate(a); accumulate_transform(m.pointer(),b);}voidSymmSCMatrix::accumulate_symmetric_outer_product(SCVector *v){ RefSCMatrix m = kit()->matrix(dim(),dim()); m->assign(0.0); m->accumulate_outer_product(v,v); scale(2.0); accumulate_symmetric_sum(m.pointer()); scale(0.5);}doubleSymmSCMatrix::scalar_product(SCVector *v){ RefSCVector v2 = kit()->vector(dim()); v2->assign(0.0); v2->accumulate_product(this,v); return v2->scalar_product(v);}Ref<MessageGrp>SymmSCMatrix::messagegrp() const{ return kit_->messagegrp();}/////////////////////////////////////////////////////////////////////////// DiagSCMatrix member functionsstatic ClassDesc DiagSCMatrix_cd( typeid(DiagSCMatrix),"DiagSCMatrix",1,"public DescribedClass", 0, 0, 0);DiagSCMatrix::DiagSCMatrix(const RefSCDimension&a, SCMatrixKit *kit): d(a), kit_(kit){}voidDiagSCMatrix::save(StateOut&s){ int nr = n(); s.put(nr); for (int i=0; i<nr; i++) { s.put(get_element(i)); }}voidDiagSCMatrix::restore(StateIn& s){ int nrt, nr = n(); s.get(nrt); if (nrt != nr) { ExEnv::errn() << "DiagSCMatrix::restore(): bad dimension" << endl; abort(); } for (int i=0; i<nr; i++) { double tmp; s.get(tmp); set_element(i, tmp); }}doubleDiagSCMatrix::maxabs() const{ Ref<SCElementMaxAbs> op = new SCElementMaxAbs(); Ref<SCElementOp> abop = op.pointer(); ((DiagSCMatrix*)this)->element_op(abop); return op->result();}voidDiagSCMatrix::randomize(){ Ref<SCElementOp> op = new SCElementRandomize(); this->element_op(op);}voidDiagSCMatrix::assign_val(double a){ Ref<SCElementOp> op = new SCElementAssign(a); this->element_op(op);}voidDiagSCMatrix::assign_p(const double*a){ int i; int nr = n(); for (i=0; i<nr; i++) { set_element(i,a[i]); }}voidDiagSCMatrix::convert(DiagSCMatrix*a){ assign(0.0); convert_accumulate(a);}voidDiagSCMatrix::convert_accumulate(DiagSCMatrix*a){ Ref<SCElementOp> op = new SCElementAccumulateDiagSCMatrix(a); element_op(op);}voidDiagSCMatrix::convert(double*a) const{ int i; int nr = n(); for (i=0; i<nr; i++) { a[i] = get_element(i); }}voidDiagSCMatrix::scale(double a){ Ref<SCElementOp> op = new SCElementScale(a); this->element_op(op);}voidDiagSCMatrix::assign_d(DiagSCMatrix*a){ this->assign(0.0); this->accumulate(a);}voidDiagSCMatrix::print(ostream&o) const{ vprint(0, o, 10);}voidDiagSCMatrix::print(const char *t, ostream&o, int i) const{ vprint(t, o, i);}voidDiagSCMatrix::vprint(const char* title, ostream& out, int i) const{ RefSCMatrix m = kit()->matrix(dim(),dim()); m->assign(0.0); m->accumulate(this); m->print(title, out, i);}DiagSCMatrix*DiagSCMatrix::clone(){ return kit()->diagmatrix(dim());}DiagSCMatrix*DiagSCMatrix::copy(){ DiagSCMatrix* result = clone(); result->assign(this); return result;}Ref<MessageGrp>DiagSCMatrix::messagegrp() const{ return kit_->messagegrp();}/////////////////////////////////////////////////////////////////////////// These member are used by the abstract SCVector classes./////////////////////////////////////////////////////////////////////////static ClassDesc SCVector_cd( typeid(SCVector),"SCVector",1,"public DescribedClass", 0, 0, 0);SCVector::SCVector(const RefSCDimension&a, SCMatrixKit *kit): d(a), kit_(kit){}SCVector::~SCVector(){}voidSCVector::save(StateOut&s){ int nr = n(); s.put(nr); for (int i=0; i<nr; i++) { s.put(get_element(i)); }}voidSCVector::restore(StateIn& s){ int nrt, nr = n(); s.get(nrt); if (nrt != nr) { ExEnv::errn() << "SCVector::restore(): bad dimension" << endl; abort(); } for (int i=0; i<nr; i++) { double tmp; s.get(tmp); set_element(i, tmp); }}doubleSCVector::maxabs() const{ Ref<SCElementMaxAbs> op = new SCElementMaxAbs(); Ref<SCElementOp> abop = op.pointer(); ((SCVector*)this)->element_op(abop); return op->result();}voidSCVector::randomize(){ Ref<SCElementOp> op = new SCElementRandomize(); this->element_op(op);}voidSCVector::assign_val(double a){ Ref<SCElementOp> op = new SCElementAssign(a); this->element_op(op);}voidSCVector::assign_p(const double*a){ int i; int nr = n(); for (i=0; i<nr; i++) { set_element(i,a[i]); }}voidSCVector::convert(SCVector*a){ assign(0.0); convert_accumulate(a);}voidSCVector::convert_accumulate(SCVector*a){ Ref<SCElementOp> op = new SCElementAccumulateSCVector(a); element_op(op);}voidSCVector::convert(double*a) const{ int i; int nr = n(); for (i=0; i<nr; i++) { a[i] = get_element(i); }}voidSCVector::scale(double a){ Ref<SCElementOp> op = new SCElementScale(a); this->element_op(op);}voidSCVector::assign_v(SCVector*a){ this->assign(0.0); this->accumulate(a);}voidSCVector::print(ostream&o) const{ vprint(0, o, 10);}voidSCVector::print(const char *t, ostream&o, int i) const{ vprint(t, o, i);}voidSCVector::normalize(){ double norm = sqrt(scalar_product(this)); if (norm > 1.e-20) norm = 1.0/norm; else { ExEnv::errn() << indent << "SCVector::normalize: tried to normalize tiny vector\n"; abort(); } scale(norm);}SCVector*SCVector::clone(){ return kit()->vector(dim());}SCVector*SCVector::copy(){ SCVector* result = clone(); result->assign(this); return result;}voidSCVector::accumulate_product_sv(SymmSCMatrix *m, SCVector *v){ RefSCMatrix mrect = kit()->matrix(m->dim(),m->dim()); mrect->assign(0.0); mrect->accumulate(m); accumulate_product(mrect.pointer(), v);}Ref<MessageGrp>SCVector::messagegrp() const{ return kit_->messagegrp();}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -