Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/util/newmat/tmt3.cpp @ 4565

Last change on this file since 4565 was 4565, checked in by patrick, 19 years ago

orxonox/trunk: added the newmat library to the project. needs some translation in directory, temp under util/newmat. is needed by the collision detection engine to perform lin alg operations such as eigenvector decomposition. perhaps we will make our own library to do that later.

File size: 5.0 KB
Line 
1
2//#define WANT_STREAM
3
4#include "include.h"
5
6#include "newmat.h"
7
8#include "tmt.h"
9
10#ifdef use_namespace
11using namespace NEWMAT;
12#endif
13
14
15/**************************** test program ******************************/
16
17void trymat3()
18{
19   Tracer et("Third test of Matrix package");
20   Tracer::PrintTrace();
21
22   {
23      Tracer et1("Stage 1");
24      int i,j;
25      SymmetricMatrix S(7);
26      for (i=1;i<=7;i++) for (j=1;j<=i;j++) S(i,j)=i*i+j;
27                S=-S+2.0;
28
29      DiagonalMatrix D(7);
30      for (i=1;i<=7;i++) D(i,i)=S(i,i);
31
32      Matrix M4(7,7); { M4=D+(D+4.0); M4=M4-D*2.0;  M4=M4-4.0; Print(M4); }
33      SymmetricMatrix S2=D; Matrix M2=S2;  { M2=-D+M2; Print(M2); }
34      UpperTriangularMatrix U2=D; { M2=U2; M2=D-M2; Print(M2); }
35      LowerTriangularMatrix L2=D; { M2=L2; M2=D-M2; Print(M2); }
36      M2=D; M2=M2-D; Print(M2);
37      for (i=1;i<=7;i++) for (j=1;j<=i;j++) L2(i,j)=2.0-i*i-j;
38      U2=L2.t(); D=D.t(); S=S.t();
39      M4=(L2-1.0)+(U2+1.0)-D-S; Print(M4);
40      M4=(-L2+1.0)+(-U2-1.0)+D+S; Print(M4);
41   }
42
43   {
44      Tracer et1("Stage 2");
45      int i,j;
46      DiagonalMatrix D(6);
47      for (i=1;i<=6;i++) D(i,i)=i*3.0+i*i+2.0;
48      UpperTriangularMatrix U2(7); LowerTriangularMatrix L2(7);
49      for (i=1;i<=7;i++) for (j=1;j<=i;j++) L2(i,j)=2.0-i*i+j;
50                { U2=L2.t(); }
51      DiagonalMatrix D1(7); for (i=1;i<=7;i++) D1(i,i)=(i-2)*(i-4);
52      Matrix M2(6,7);
53      for (i=1;i<=6;i++) for (j=1;j<=7;j++) M2(i,j)=2.0+i*j+i*i+2.0*j*j;
54      Matrix MD=D; SymmetricMatrix MD1(1); MD1=D1;
55      Matrix MX=MD*M2*MD1 - D*(M2*D1); Print(MX);
56      MX=MD*M2*MD1 - (D*M2)*D1; Print(MX);
57      {
58         D.ReSize(7); for (i=1;i<=7;i++) D(i,i)=i*3.0+i*i+2.0;
59         LowerTriangularMatrix LD(1); LD=D;
60         UpperTriangularMatrix UD(1); UD=D;
61         M2=U2; M2=LD*M2*MD1 - D*(U2*D1); Print(M2);
62         M2=U2; M2=UD*M2*MD1 - (D*U2)*D1; Print(M2);
63         M2=L2; M2=LD*M2*MD1 - D*(L2*D1); Print(M2);
64         M2=L2; M2=UD*M2*MD1 - (D*L2)*D1; Print(M2);
65      }
66   }
67
68   {
69      Tracer et1("Stage 3");
70      // test inverse * scalar
71      DiagonalMatrix D(6);
72      for (int i=1;i<=6;i++) D(i)=i*i;
73      DiagonalMatrix E = D.i() * 4.0;
74      DiagonalMatrix I(6); I = 1.0;
75      E=D*E-I*4.0; Print(E);
76      E = D.i() / 0.25; E=D*E-I*4.0; Print(E);
77   }
78   {
79      Tracer et1("Stage 4");
80      Matrix sigma(3,3); Matrix sigmaI(3,3);
81      sigma = 0; sigma(1,1) = 1.0; sigma(2,2) = 1.0; sigma(3,3) = 1.0;
82      sigmaI = sigma.i();
83      sigmaI -= sigma;  Clean(sigmaI, 0.000000001); Print(sigmaI);
84   }
85   {
86      Tracer et1("Stage 5");
87      Matrix X(5,5); DiagonalMatrix DM(5);
88      for (int i=1; i<=5; i++) for (int j=1; j<=5; j++)
89         X(i,j) = (23*i+59*j) % 43;
90      DM << 1 << 8 << -7 << 2 << 3;
91      Matrix Y = X.i() * DM; Y = X * Y - DM;
92      Clean(Y, 0.000000001); Print(Y);
93   }
94   {
95      Tracer et1("Stage 6");          // test reverse function
96      ColumnVector CV(10), RCV(10);
97      CV  <<  2 << 7 << 1  << 6 << -3 <<  1 << 8 << -4 << 0 << 17;
98      RCV << 17 << 0 << -4 << 8 << 1  << -3 << 6 <<  1 << 7 << 2;
99      ColumnVector X = CV - RCV.Reverse(); Print(X);
100      RowVector Y = CV.t() - RCV.t().Reverse(); Print(Y);
101      DiagonalMatrix D = CV.AsDiagonal() - RCV.AsDiagonal().Reverse();
102      Print(D);
103      X = CV & CV.Rows(1,9).Reverse();
104      ColumnVector Z(19);
105      Z.Rows(1,10) = RCV.Reverse(); Z.Rows(11,19) = RCV.Rows(2,10);
106      X -= Z; Print(X); Z -= Z.Reverse(); Print(Z);
107      Matrix A(3,3); A << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9;
108      Matrix B(3,3); B << 9 << 8 << 7 << 6 << 5 << 4 << 3 << 2 << 1;
109      Matrix Diff = A - B.Reverse(); Print(Diff);
110      Diff = (-A).Reverse() + B; Print(Diff);
111      UpperTriangularMatrix U;
112      U << A.Reverse(); Diff = U; U << B; Diff -= U; Print(Diff);
113      U << (-A).Reverse(); Diff = U; U << B; Diff += U; Print(Diff);
114   }
115   {
116      Tracer et1("Stage 7");           // test IsSingular function
117      ColumnVector XX(4);
118      Matrix A(3,3);
119      A = 0;
120      CroutMatrix B1 = A;
121      XX(1) = B1.IsSingular() ? 0 : 1;
122      A << 1 << 3 << 6
123        << 7 << 11 << 13
124        << 2 << 4  << 1;
125      CroutMatrix B2(A);
126      XX(2) = B2.IsSingular() ? 1 : 0;
127      BandMatrix C(3,1,1); C.Inject(A);
128      BandLUMatrix B3(C);
129      XX(3) = B3.IsSingular() ? 1 : 0;
130      C = 0;
131      BandLUMatrix B4(C);
132      XX(4) = B4.IsSingular() ? 0 : 1;
133      Print(XX);
134   }
135   {
136      Tracer et1("Stage 8");           // inverse with vector of 0s
137      Matrix A(3,3); Matrix Z(3,3); ColumnVector X(6);
138      A <<  1 <<  3 <<  6
139        <<  7 << 11 << 13
140        <<  2 <<  4 <<  1;
141      Z = 0;
142      Matrix B = (A | Z) & (Z | A);   // 6 * 6 matrix
143      X = 0.0;
144      X = B.i() * X;
145      Print(X);
146      // also check inverse with non-zero Y
147      Matrix Y(3,3);
148      Y << 0.0 << 1.0 << 1.0
149        << 5.0 << 0.0 << 5.0
150        << 3.0 << 3.0 << 0.0;
151      Matrix YY = Y & Y;        // stack Y matrices
152      YY = B.i() * YY;
153      Matrix Y1 = A.i() * Y;
154      YY -= Y1 & Y1; Clean(YY, 0.000000001); Print(YY);
155      Y1 = A * Y1 - Y; Clean(Y1, 0.000000001); Print(Y1);
156   }
157
158
159}
160
Note: See TracBrowser for help on using the repository browser.