root/library/tests/square_mat_test.cpp @ 706

Revision 706, 2.0 kB (checked in by smidl, 15 years ago)

eol-native

  • Property svn:eol-style set to native
Line 
1#include "../bdm/math/square_mat.h"
2#include "../bdm/math/chmat.h"
3#include "itpp_ext.h"
4#include "mat_checks.h"
5#include "UnitTest++.h"
6#include <math.h>
7
8const double epsilon = 0.00001;
9
10using namespace itpp;
11
12using bdm::fsqmat;
13using bdm::chmat;
14using bdm::ldmat;
15
16template<typename TMatrix>
17void test_square_matrix ( double epsilon ) {
18        int sz = 3;
19        mat A0 = randu ( sz, sz );
20        mat A = A0 * A0.T();
21
22        TMatrix sqmat ( A );
23        CHECK_EQUAL ( sz, sqmat.rows() );
24        CHECK_EQUAL ( sz, sqmat.cols() );
25
26        mat res = sqmat.to_mat();
27        CHECK_CLOSE ( A, res, epsilon );
28
29        vec v = randu ( sz );
30        double w = randu();
31        TMatrix sqmat2 = sqmat;
32        sqmat2.opupdt ( v, w );
33
34        res = A + w * outer_product ( v, v );
35        CHECK_CLOSE ( res, sqmat2.to_mat(), epsilon );
36
37        TMatrix invmat ( sz );
38        sqmat.inv ( invmat );
39        mat invA = inv ( A );
40        CHECK_CLOSE ( invA, invmat.to_mat(), epsilon );
41
42        double d = det ( A );
43        CHECK_CLOSE ( log ( d ), sqmat.logdet(), epsilon );
44
45        double q = sqmat.qform ( ones ( sz ) );
46        CHECK_CLOSE ( sumsum ( A ), q, epsilon );
47
48        q = sqmat.qform ( v );
49        double r = ( A * v ) * v;
50        CHECK_CLOSE ( r, q, epsilon );
51
52        q = sqmat.invqform ( v );
53        r = ( invA * v ) * v;
54        CHECK_CLOSE ( r, q, epsilon );
55
56        sqmat2 = sqmat;
57        sqmat2.clear();
58        CHECK_EQUAL ( 0, sqmat2.qform ( ones ( sz ) ) );
59
60        TMatrix twice = sqmat;
61        twice += sqmat;
62        res = 2 * A;
63        CHECK_CLOSE ( res, twice.to_mat(), epsilon );
64
65        twice = sqmat;
66        twice *= 2;
67        CHECK_CLOSE ( res, twice.to_mat(), epsilon );
68
69        sqmat2 = sqmat;
70        mat B = randu ( sz, sz );
71        sqmat2.mult_sym ( B );
72        res = ( B * A ) * B.T();
73        CHECK_CLOSE ( res, sqmat2.to_mat(), epsilon );
74
75        mat C = randu ( sz, sz - 1 );
76        TMatrix CAC ( sz - 1 );
77        sqmat.mult_sym_t ( C, CAC );
78        res = ( C.T() * A ) * C;
79        CHECK_CLOSE ( res, CAC.to_mat(), epsilon );
80
81        sqmat2 = sqmat;
82        sqmat2.mult_sym_t ( B );
83        res = ( B.T() * A ) * B;
84        CHECK_CLOSE ( res, sqmat2.to_mat(), epsilon );
85}
86
87TEST ( ldmat_test ) {
88        test_square_matrix<ldmat> ( epsilon );
89}
90
91TEST ( fsqmat_test ) {
92        test_square_matrix<fsqmat> ( epsilon );
93}
94
95TEST ( chmat_test ) {
96        test_square_matrix<chmat> ( epsilon );
97}
Note: See TracBrowser for help on using the browser.