Changeset 32 for bdm/math

Show
Ignore:
Timestamp:
03/03/08 13:00:32 (16 years ago)
Author:
smidl
Message:

test KF : estimation of R in KF is not possible! Likelihood of y_t is growing when R -> 0

Location:
bdm/math
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • bdm/math/libDC.cpp

    r26 r32  
    1717void fsqmat::mult_sym ( const mat &C) {M=C *M*C.T();}; 
    1818void 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) );}; 
     19void fsqmat::mult_sym ( const mat &C, fsqmat &U) const { U.M = ( C *(M*C.T()) );}; 
     20void fsqmat::mult_sym_t ( const mat &C, fsqmat &U) const { U.M = ( C.T() *(M*C) );}; 
    2121void fsqmat::inv ( fsqmat &Inv ) {mat IM = itpp::inv ( M ); Inv=IM;}; 
    2222void fsqmat::clear() {M.clear();}; 
    23 fsqmat::fsqmat ( const mat &M0 ) 
     23fsqmat::fsqmat ( const mat &M0 ) : sqmat(M0.cols()) 
    2424{ 
    2525        it_assert_debug ( ( M0.cols() ==M0.rows() ),"M0 must be square" ); 
    26         M=M0;dim=M0.cols(); 
     26        M=M0; 
    2727}; 
    2828 
    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 
     31fsqmat::fsqmat(const int dim0): sqmat(dim0), M(dim0,dim0) {}; 
     32 
     33std::ostream &operator<< ( std::ostream &os, const fsqmat &ld ) { 
    3434        os << ld.M << endl; 
    3535        return os; 
     
    3737 
    3838 
    39 ldmat::ldmat( const mat &exL, const vec &exD ) { 
     39ldmat::ldmat( const mat &exL, const vec &exD ) : sqmat(exD.length()) { 
    4040        D = exD; 
    4141        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 
     44ldmat::ldmat() :sqmat(0) {} 
     45 
     46ldmat::ldmat(const int dim0): sqmat(dim0), D(dim0),L(dim0,dim0) {} 
     47 
     48ldmat::ldmat(const vec D0):sqmat(D0.length()) { 
    5449        D = D0; 
    55         dim = D0.length(); 
    5650        L = eye(dim); 
    5751} 
    5852 
    59 ldmat::ldmat( const mat &V ) { 
     53ldmat::ldmat( const mat &V ):sqmat(V.cols()) { 
    6054//TODO check if correct!! Based on heuristic observation of lu() 
    6155 
    62         dim = V.cols(); 
    6356        it_assert_debug( dim == V.rows(),"ldmat::ldmat matrix V is not square!" ); 
    6457                 
     
    8679} 
    8780 
    88 std::ostream &operator<< ( std::ostream &os, ldmat &ld ) { 
     81std::ostream &operator<< ( std::ostream &os, const ldmat &ld ) { 
    8982        os << "L:" << ld.L << endl; 
    9083        os << "D:" << ld.D << endl; 
     
    130123void ldmat::clear(){L.clear(); for ( int i=0;i<L.cols();i++ ){L( i,i )=1;}; D.clear();} 
    131124 
    132 void ldmat::inv( ldmat &Inv ) { 
     125void ldmat::inv( ldmat &Inv ) const { 
    133126        int dim = D.length(); 
    134127        Inv.clear();   //Inv = zero in LD 
     
    152145} 
    153146 
    154 void ldmat::mult_sym( const mat &C, ldmat &U) { 
     147void ldmat::mult_sym( const mat &C, ldmat &U) const { 
    155148        mat A=L*C.T(); //could be done more efficiently using BLAS 
    156149        U.ldform(A,D); 
    157150} 
    158151 
    159 void ldmat::mult_sym_t( const mat &C, ldmat &U) { 
     152void ldmat::mult_sym_t( const mat &C, ldmat &U) const { 
    160153        mat A=L*C; 
    161154/*      vec nD=zeros(U.rows()); 
     
    173166} 
    174167 
    175 double ldmat::qform( const vec &v ) { 
     168double ldmat::qform( const vec &v ) const { 
    176169        double x = 0.0, sum; 
    177170        int i,j; 
     
    179172        for ( i=0; i<D.length(); i++ ) { //rows of L 
    180173                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 );} 
    182175                x +=D( i )*sum*sum; 
    183176        }; 
     
    191184} 
    192185 
    193 vec ldmat::sqrt_mult( const vec &x ) { 
     186vec ldmat::sqrt_mult( const vec &x ) const { 
    194187        int i,j; 
    195188        vec res( dim ); 
     
    383376        } 
    384377} 
    385  
    386  
  • bdm/math/libDC.h

    r28 r32  
    6161                Used e.g. in generating normal samples. 
    6262                */ 
    63                 virtual vec sqrt_mult (const vec &v ) =0; 
     63                virtual vec sqrt_mult (const vec &v ) const =0; 
    6464 
    6565                /*! 
     
    6767 
    6868                */ 
    69                 virtual double qform (const vec &v ) =0; 
     69                virtual double qform (const vec &v ) const =0; 
    7070 
    7171//      //! easy version of the 
     
    8383                //! Destructor for future use; 
    8484                virtual ~sqmat(){}; 
     85                //! Default constructor 
     86                sqmat(const int dim0): dim(dim0){}; 
    8587        protected: 
    8688                int dim; 
     
    101103                void mult_sym ( const mat &C); 
    102104                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; 
    105107                void clear(); 
    106108 
     
    124126 
    125127                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;}; 
    128130 
    129131                fsqmat& operator += ( const fsqmat &A ) {M+=A.M;return *this;}; 
     
    132134//              fsqmat& operator = ( const fsqmat &A) {M=A.M; return *this;}; 
    133135 
    134                 friend std::ostream &operator<< ( std::ostream &os, fsqmat &sq ); 
     136                friend std::ostream &operator<< ( std::ostream &os, const fsqmat &sq ); 
    135137 
    136138}; 
     
    162164                void add ( const ldmat &ld2, double w=1.0 ); 
    163165                double logdet() const; 
    164                 double qform (const vec &v ); 
     166                double qform (const vec &v ) const; 
    165167//      sqmat& operator -= ( const sqmat & ld2 ); 
    166168                void clear(); 
    167169                int cols() const; 
    168170                int rows() const; 
    169                 vec sqrt_mult ( const vec &v ); 
     171                vec sqrt_mult ( const vec &v ) const; 
    170172 
    171173                /*! \brief Matrix inversion preserving the chosen form. 
     
    174176 
    175177                */ 
    176                 virtual void inv ( ldmat &Inv ); 
     178                virtual void inv ( ldmat &Inv ) const; 
    177179 
    178180                /*! \brief Symmetric multiplication of $U$ by a general matrix $C$, result of which is stored in the current class. 
     
    181183 
    182184                */ 
    183                 void mult_sym ( const mat &C, ldmat &U); 
     185                void mult_sym ( const mat &C, ldmat &U) const; 
    184186 
    185187                /*! \brief Symmetric multiplication of $U$ by a transpose of a general matrix $C$, result of which is stored in the current class. 
     
    188190 
    189191                */ 
    190                 void mult_sym_t ( const mat &C, ldmat &U); 
     192                void mult_sym_t ( const mat &C, ldmat &U) const; 
    191193 
    192194 
     
    200202                */ 
    201203                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;} 
    202208 
    203209                ldmat& operator += ( const ldmat &ldA ); 
     
    205211                ldmat& operator *= ( double x ); 
    206212 
    207                 friend std::ostream &operator<< ( std::ostream &os, ldmat &sq ); 
     213                friend std::ostream &operator<< ( std::ostream &os, const ldmat &sq ); 
     214 
    208215 
    209216        protected: