Legend:
- Unmodified
- Added
- Removed
-
bdm/math/libDC.cpp
r26 r32 17 17 void fsqmat::mult_sym ( const mat &C) {M=C *M*C.T();}; 18 18 void fsqmat::mult_sym_t ( const mat &C) {M=C.T() *M*C;}; 19 void fsqmat::mult_sym ( const mat &C, fsqmat &U) { U.M = ( C *(M*C.T()) );};20 void fsqmat::mult_sym_t ( const mat &C, fsqmat &U) { U.M = ( C.T() *(M*C) );};19 void fsqmat::mult_sym ( const mat &C, fsqmat &U) const { U.M = ( C *(M*C.T()) );}; 20 void fsqmat::mult_sym_t ( const mat &C, fsqmat &U) const { U.M = ( C.T() *(M*C) );}; 21 21 void fsqmat::inv ( fsqmat &Inv ) {mat IM = itpp::inv ( M ); Inv=IM;}; 22 22 void fsqmat::clear() {M.clear();}; 23 fsqmat::fsqmat ( const mat &M0 ) 23 fsqmat::fsqmat ( const mat &M0 ) : sqmat(M0.cols()) 24 24 { 25 25 it_assert_debug ( ( M0.cols() ==M0.rows() ),"M0 must be square" ); 26 M=M0; dim=M0.cols();26 M=M0; 27 27 }; 28 28 29 fsqmat::fsqmat() {};30 31 fsqmat::fsqmat(const int dim0): M(dim0,dim0) {};32 33 std::ostream &operator<< ( std::ostream &os, fsqmat &ld ) {29 //fsqmat::fsqmat() {}; 30 31 fsqmat::fsqmat(const int dim0): sqmat(dim0), M(dim0,dim0) {}; 32 33 std::ostream &operator<< ( std::ostream &os, const fsqmat &ld ) { 34 34 os << ld.M << endl; 35 35 return os; … … 37 37 38 38 39 ldmat::ldmat( const mat &exL, const vec &exD ) {39 ldmat::ldmat( const mat &exL, const vec &exD ) : sqmat(exD.length()) { 40 40 D = exD; 41 41 L = exL; 42 dim = exD.length(); 43 } 44 45 ldmat::ldmat() { 46 dim = 0; 47 } 48 49 ldmat::ldmat(const int dim0): D(dim0),L(dim0,dim0) { 50 dim = dim0; 51 } 52 53 ldmat::ldmat(const vec D0) { 42 } 43 44 ldmat::ldmat() :sqmat(0) {} 45 46 ldmat::ldmat(const int dim0): sqmat(dim0), D(dim0),L(dim0,dim0) {} 47 48 ldmat::ldmat(const vec D0):sqmat(D0.length()) { 54 49 D = D0; 55 dim = D0.length();56 50 L = eye(dim); 57 51 } 58 52 59 ldmat::ldmat( const mat &V ) {53 ldmat::ldmat( const mat &V ):sqmat(V.cols()) { 60 54 //TODO check if correct!! Based on heuristic observation of lu() 61 55 62 dim = V.cols();63 56 it_assert_debug( dim == V.rows(),"ldmat::ldmat matrix V is not square!" ); 64 57 … … 86 79 } 87 80 88 std::ostream &operator<< ( std::ostream &os, ldmat &ld ) {81 std::ostream &operator<< ( std::ostream &os, const ldmat &ld ) { 89 82 os << "L:" << ld.L << endl; 90 83 os << "D:" << ld.D << endl; … … 130 123 void ldmat::clear(){L.clear(); for ( int i=0;i<L.cols();i++ ){L( i,i )=1;}; D.clear();} 131 124 132 void ldmat::inv( ldmat &Inv ) {125 void ldmat::inv( ldmat &Inv ) const { 133 126 int dim = D.length(); 134 127 Inv.clear(); //Inv = zero in LD … … 152 145 } 153 146 154 void ldmat::mult_sym( const mat &C, ldmat &U) {147 void ldmat::mult_sym( const mat &C, ldmat &U) const { 155 148 mat A=L*C.T(); //could be done more efficiently using BLAS 156 149 U.ldform(A,D); 157 150 } 158 151 159 void ldmat::mult_sym_t( const mat &C, ldmat &U) {152 void ldmat::mult_sym_t( const mat &C, ldmat &U) const { 160 153 mat A=L*C; 161 154 /* vec nD=zeros(U.rows()); … … 173 166 } 174 167 175 double ldmat::qform( const vec &v ) {168 double ldmat::qform( const vec &v ) const { 176 169 double x = 0.0, sum; 177 170 int i,j; … … 179 172 for ( i=0; i<D.length(); i++ ) { //rows of L 180 173 sum = 0.0; 181 for ( j= 0; j<=i; j++ ){sum+=L( i,j )*v( j);}174 for ( j=i; j<=i; j++ ){sum+=L( i,j )*v( i );} 182 175 x +=D( i )*sum*sum; 183 176 }; … … 191 184 } 192 185 193 vec ldmat::sqrt_mult( const vec &x ) {186 vec ldmat::sqrt_mult( const vec &x ) const { 194 187 int i,j; 195 188 vec res( dim ); … … 383 376 } 384 377 } 385 386 -
bdm/math/libDC.h
r28 r32 61 61 Used e.g. in generating normal samples. 62 62 */ 63 virtual vec sqrt_mult (const vec &v ) =0;63 virtual vec sqrt_mult (const vec &v ) const =0; 64 64 65 65 /*! … … 67 67 68 68 */ 69 virtual double qform (const vec &v ) =0;69 virtual double qform (const vec &v ) const =0; 70 70 71 71 // //! easy version of the … … 83 83 //! Destructor for future use; 84 84 virtual ~sqmat(){}; 85 //! Default constructor 86 sqmat(const int dim0): dim(dim0){}; 85 87 protected: 86 88 int dim; … … 101 103 void mult_sym ( const mat &C); 102 104 void mult_sym_t ( const mat &C); 103 void mult_sym ( const mat &C, fsqmat &U) ;104 void mult_sym_t ( const mat &C, fsqmat &U) ;105 void mult_sym ( const mat &C, fsqmat &U) const; 106 void mult_sym_t ( const mat &C, fsqmat &U) const; 105 107 void clear(); 106 108 … … 124 126 125 127 double logdet() const {return log ( det ( M ) );}; 126 double qform (const vec &v ) {return ( v* ( M*v ) );};127 vec sqrt_mult (const vec &v ) {it_error ( "not implemented" );return v;};128 double qform (const vec &v ) const {return ( v* ( M*v ) );}; 129 vec sqrt_mult (const vec &v ) const {it_error ( "not implemented" );return v;}; 128 130 129 131 fsqmat& operator += ( const fsqmat &A ) {M+=A.M;return *this;}; … … 132 134 // fsqmat& operator = ( const fsqmat &A) {M=A.M; return *this;}; 133 135 134 friend std::ostream &operator<< ( std::ostream &os, fsqmat &sq );136 friend std::ostream &operator<< ( std::ostream &os, const fsqmat &sq ); 135 137 136 138 }; … … 162 164 void add ( const ldmat &ld2, double w=1.0 ); 163 165 double logdet() const; 164 double qform (const vec &v ) ;166 double qform (const vec &v ) const; 165 167 // sqmat& operator -= ( const sqmat & ld2 ); 166 168 void clear(); 167 169 int cols() const; 168 170 int rows() const; 169 vec sqrt_mult ( const vec &v ) ;171 vec sqrt_mult ( const vec &v ) const; 170 172 171 173 /*! \brief Matrix inversion preserving the chosen form. … … 174 176 175 177 */ 176 virtual void inv ( ldmat &Inv ) ;178 virtual void inv ( ldmat &Inv ) const; 177 179 178 180 /*! \brief Symmetric multiplication of $U$ by a general matrix $C$, result of which is stored in the current class. … … 181 183 182 184 */ 183 void mult_sym ( const mat &C, ldmat &U) ;185 void mult_sym ( const mat &C, ldmat &U) const; 184 186 185 187 /*! \brief Symmetric multiplication of $U$ by a transpose of a general matrix $C$, result of which is stored in the current class. … … 188 190 189 191 */ 190 void mult_sym_t ( const mat &C, ldmat &U) ;192 void mult_sym_t ( const mat &C, ldmat &U) const; 191 193 192 194 … … 200 202 */ 201 203 void ldform (const mat &A,const vec &D0 ); 204 205 //! Access functions 206 void setD (const vec &nD){D=nD;} 207 void setL (const vec &nL){L=nL;} 202 208 203 209 ldmat& operator += ( const ldmat &ldA ); … … 205 211 ldmat& operator *= ( double x ); 206 212 207 friend std::ostream &operator<< ( std::ostream &os, ldmat &sq ); 213 friend std::ostream &operator<< ( std::ostream &os, const ldmat &sq ); 214 208 215 209 216 protected: