root/library/bdm/math/chmat.cpp @ 437

Revision 437, 1.6 kB (checked in by smidl, 15 years ago)

missing functions in chmat - square_matrix test now passes for chmat

  • Property svn:eol-style set to native
Line 
1
2#include "chmat.h"
3
4//using std::endl;
5
6
7void chmat::opupdt ( const vec &v, double w ) {
8//TODO see cholupdt in lhotse
9        mat Z;
10        mat R;
11        mat V(1,v.length());
12        V.set_row(0,v*sqrt(w));
13        Z = concat_vertical ( Ch,V );
14        qr ( Z,R );
15        Ch = R ( 0, Ch.rows()-1, 0, Ch.cols()-1 );
16};
17mat chmat::to_mat() const {mat F=Ch.T() *Ch;return F;};
18void chmat::mult_sym ( const mat &C ) {
19        it_assert_debug(C.cols()==dim, "Wrong dimension of U");
20        if(!qr(Ch*C.T(), Ch)) {it_warning("QR unstable in chmat mult_sym");}
21};
22void chmat::mult_sym ( const mat &C , chmat &U ) const {
23        it_assert_debug(C.cols()==U.dim, "Wrong dimension of U");
24        if(!qr(Ch*C.T(), U.Ch)) {it_warning("QR unstable in chmat mult_sym");}
25};
26void chmat::mult_sym_t ( const mat &C ) {
27        it_assert_debug(C.rows()==dim, "Wrong dimension of U");
28        if(!qr(Ch*C, Ch)) {it_warning("QR unstable in chmat mult_sym");}
29};
30void chmat::mult_sym_t ( const mat &C, chmat &U ) const {
31        it_assert_debug(C.rows()==U.dim, "Wrong dimension of U");
32        if(!qr(Ch*C, U.Ch)) {it_warning("QR unstable in chmat mult_sym");}
33};
34double chmat::logdet() const {
35        double ldet=0.0; int i;
36        //sum of logs of (possibly negative!) diagonal entries
37        for ( i=0;i<Ch.rows();i++ ) {ldet+=log ( std::fabs ( Ch ( i,i ) ) );}
38        return 2*ldet; //compensate for Ch being sqrt()
39};
40//TODO can be done more efficiently using BLAS, see triangular matrices
41vec chmat::sqrt_mult ( const vec &v ) const {vec pom; pom = Ch*v; return pom;};
42double chmat::qform ( const vec &v ) const {vec pom; pom = Ch*v; return pom*pom;};
43double chmat::invqform ( const vec &v ) const {
44        vec pom(v.length());
45        forward_substitution(Ch.T(),v,pom);
46        return pom*pom;
47};
48void chmat::clear() {Ch.clear();};
Note: See TracBrowser for help on using the browser.