root/library/bdm/math/chmat.h @ 1130

Revision 1064, 4.2 kB (checked in by mido, 14 years ago)

astyle applied all over the library

  • Property svn:eol-style set to native
Line 
1/*!
2 * \file
3 * \brief Matrices in decomposed forms (LDL', LU, UDU', etc).
4 * \author Vaclav Smidl.
5 *
6 * -----------------------------------
7 * BDM++ - C++ library for Bayesian Decision Making under Uncertainty
8 *
9 * Using IT++ for numerical operations
10 * -----------------------------------
11 */
12
13#ifndef CHMAT_H
14#define CHMAT_H
15
16#include "../bdmerror.h"
17#include "square_mat.h"
18
19namespace bdm {
20
21/*! \brief Symmetric matrix stored in square root decomposition using upper cholesky
22
23This matrix represent \f$A=Ch' Ch\f$ where only the upper triangle \f$Ch\f$ is stored;
24
25*/
26class chmat : public sqmat {
27protected:
28//! Upper triangle of the cholesky matrix
29    mat Ch;
30public:
31
32    void opupdt ( const vec &v, double w );
33    mat to_mat() const;
34    void mult_sym ( const mat &C );
35    //! mult_sym with return value in parameter \c U
36    void mult_sym ( const mat &C , chmat &U ) const;
37    void mult_sym_t ( const mat &C );
38    //! mult_sym with return value in parameter \c U
39    void mult_sym_t ( const mat &C, chmat &U ) const;
40    double logdet() const;
41    vec sqrt_mult ( const vec &v ) const;
42    double qform ( const vec &v ) const;
43    double invqform ( const vec &v ) const;
44    void clear();
45    //! add another chmat \c A2 with weight \c w.
46    void add ( const chmat &A2, double w = 1.0 );
47    //!Inversion in the same form, i.e. cholesky
48    void inv ( chmat &Inv ) const       {
49        ( Inv.Ch ) = itpp::inv ( Ch ).T();
50        Inv.dim = dim;
51    }; //Fixme: can be more efficient
52    ;
53//      void inv ( mat &Inv );
54
55    //! Destructor for future use;
56    virtual ~chmat() {};
57    //!
58    chmat ( ) : sqmat (), Ch ( ) {};
59    //! Default constructor
60    chmat ( const int dim0 ) : sqmat ( dim0 ), Ch ( dim0, dim0 ) {};
61    //! Default constructor
62    chmat ( const vec &v ) : sqmat ( v.length() ), Ch ( diag ( sqrt ( v ) ) ) {};
63    //! Copy constructor
64    chmat ( const chmat &Ch0 ) : sqmat ( Ch0.dim ), Ch ( Ch0.dim, Ch0.dim ) {
65        Ch = Ch0.Ch;
66    }
67
68    //! Default constructor (m3k:cholform)
69    chmat ( const mat &M ) : sqmat ( M.rows() ), Ch ( M.rows(), M.cols() ) {
70        mat Q;
71        bdm_assert_debug ( M.rows() == M.cols(), "chmat:: input matrix must be square!" );
72        Ch = chol ( M );
73    }
74
75    /*!
76      Some templates require this constructor to compile, but
77      it shouldn't actually be called.
78      \note may be numerically unstable
79    */
80    chmat ( const chmat &M, const ivec &perm ): sqmat(perm.length()) {
81        mat complete = M.to_mat ();
82        mat subs = complete.get_cols(perm);
83        Ch = chol(subs.get_rows(perm));
84    }
85
86    //! Access function
87    mat & _Ch() {
88        return Ch;
89    }
90    //! Access function
91    const mat & _Ch() const {
92        return Ch;
93    }
94    //! Access functions
95    void setD ( const vec &nD ) {
96        Ch = diag ( sqrt ( nD ) );
97    }
98    //! Access functions
99    void setCh ( const vec &chQ ) {
100        bdm_assert_debug ( chQ.length() == dim * dim, "wrong length" );
101        copy_vector ( dim*dim, chQ._data(), Ch._data() );
102    }
103    //! access function
104    void setCh ( const chmat &Ch0 ) {
105        Ch = Ch0._Ch();
106        dim = Ch0.rows();
107    }
108    //! access function
109    void setCh ( const mat &Ch0 ) {
110        //TODO check if Ch0 is OK!!!
111        Ch = Ch0;
112        dim = Ch0.rows();
113    }
114
115    //! Access functions
116    void setD ( const vec &nD, int i ) {
117        for ( int j = i; j < nD.length(); j++ ) {
118            Ch ( j, j ) = sqrt ( nD ( j - i ) );    //Fixme can be more general
119        }
120    }
121
122    //! Operator
123    chmat& operator += ( const chmat &A2 );
124    //! Operator
125    chmat& operator -= ( const chmat &A2 );
126    //! Operator
127    chmat& operator * ( const double &d ) {
128        Ch*sqrt ( d );
129        return *this;
130    };
131    //! Operator
132    chmat& operator = ( const chmat &A2 ) {
133        Ch = A2.Ch;
134        dim = A2.dim;
135        return *this;
136    }
137    //! Operator
138    chmat& operator *= ( double x ) {
139        Ch *= sqrt ( x );
140        return *this;
141    };
142};
143
144
145//////// Operations:
146//!mapping of add operation to operators
147inline chmat& chmat::operator += ( const chmat & A2 )  {
148    this->add ( A2 );
149    return *this;
150}
151//!mapping of negative add operation to operators
152inline chmat& chmat::operator -= ( const chmat & A2 )  {
153    this->add ( A2, -1.0 );
154    return *this;
155}
156
157}
158
159#endif // CHMAT_H
Note: See TracBrowser for help on using the browser.