Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/util/newmat/tmtl.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#define WANT_MATH
5
6#include "newmat.h"
7
8#include "tmt.h"
9
10#ifdef use_namespace
11using namespace NEWMAT;
12#endif
13
14
15
16// test maxima and minima
17
18Real TestMax(const GenericMatrix& GM)
19{
20   Matrix M = GM;
21   ColumnVector CV = GM.AsColumn();
22
23   int c, i, j, k; int n = CV.Nrows(), nr = M.Nrows(), nc = M.Ncols();
24   Real x1, x2, x3;
25
26   MatrixBandWidth mbw = GM.BandWidth();
27   int u = mbw.Upper(); int l = mbw.Lower();
28   bool IsBandMatrix = u > 0 && l > 0 && !(u == 0 && l == 0);
29
30   x1 = GM.MaximumAbsoluteValue();
31   x2 = GM.MaximumAbsoluteValue1(i);
32   if (fabs(CV(i)) != x2) return 1.1;
33   x3 = GM.MaximumAbsoluteValue2(i,j);
34   if (fabs(M(i,j)) != x3) return 1.2;
35   if (x3 != x1) return 1.3;
36   if (x2 != x1) return 1.4;
37   c = 0;
38   for (k = 1; k <= n; k++)
39   {
40      Real cvk = fabs(CV(k));
41      if (x1 <= cvk) { if (x1 < cvk) return 1.5; else c++; }
42   }
43   if (c == 0) return 1.6;
44
45
46   x1 = GM.MinimumAbsoluteValue();
47   x2 = GM.MinimumAbsoluteValue1(i);
48   if (fabs(CV(i)) != x2) return 2.1;
49   x3 = GM.MinimumAbsoluteValue2(i,j);
50   if (fabs(M(i,j)) != x3) return 2.2;
51   if (x3 != x1) return 2.3;
52   if (x2 != CV.MinimumAbsoluteValue()) return 2.4;
53   c = 0;
54   if (IsBandMatrix)
55   {
56      for (i = 1; i <= nr; i++) for (j = 1; j <= nc; j++)
57         if (i - j <= l && j - i <= u)
58      {
59         Real mij = fabs(M(i,j));
60         if (x1 >= mij) { if (x1 > mij) return 2.51; else c++; }
61      }
62   }
63   else
64   {
65      for (k = 1; k <= n; k++)
66      {
67         Real cvk = fabs(CV(k));
68         if (x1 >= cvk) { if (x1 > cvk) return 2.52; else c++; }
69      }
70   }
71   if (c == 0) return 2.6;
72
73   x1 = GM.Maximum();
74   x2 = GM.Maximum1(i);
75   if (CV(i) != x2) return 3.1;
76   x3 = GM.Maximum2(i,j);
77   if (M(i,j) != x3) return 3.2;
78   if (x3 != x1) return 3.3;
79   if (x2 != CV.Maximum()) return 3.4;
80   c = 0;
81   if (IsBandMatrix)
82   {
83      for (i = 1; i <= nr; i++) for (j = 1; j <= nc; j++)
84         if (i - j <= l && j - i <= u)
85      {
86         Real mij = M(i,j);
87         if (x1 <= mij) { if (x1 < mij) return 3.51; else c++; }
88      }
89   }
90   else
91   {
92      for (k = 1; k <= n; k++)
93      {
94         Real cvk = CV(k);
95         if (x1 <= cvk) { if (x1 < cvk) return 3.52; else c++; }
96      }
97   }
98   if (c == 0) return 3.6;
99
100   x1 = GM.Minimum();
101   x2 = GM.Minimum1(i);
102   if (CV(i) != x2) return 4.1;
103   x3 = GM.Minimum2(i,j);
104   if (M(i,j) != x3) return 4.2;
105   if (x3 != x1) return 4.3;
106   if (x2 != CV.Minimum()) return 4.4;
107   c = 0;
108   if (IsBandMatrix)
109   {
110      for (i = 1; i <= nr; i++) for (j = 1; j <= nc; j++)
111         if (i - j <= l && j - i <= u)
112      {
113         Real mij = M(i,j);
114         if (x1 >= mij) { if (x1 > mij) return 4.51; else c++; }
115      }
116   }
117   else
118   {
119      for (k = 1; k <= n; k++)
120      {
121         Real cvk = CV(k);
122         if (x1 >= cvk) { if (x1 > cvk) return 4.52; else c++; }
123      }
124   }
125   if (c == 0) return 4.6;
126
127   return 0;
128
129}
130
131
132void trymatl()
133{
134   Tracer et("Twenty first test of Matrix package");
135   Tracer::PrintTrace();
136
137   Matrix M(4, 4);
138   M <<  1.5 <<  1.0 << -4.0 <<  4.5
139     <<  3.5 <<  7.0 <<  2.0 << -1.0
140     << -1.5 <<  7.5 << -6.0 <<  5.0
141     <<  0.5 << -8.0 <<  5.5 <<  4.0;
142   UpperTriangularMatrix UM;  UM << M;
143   LowerTriangularMatrix LM;  LM << -M;
144   SymmetricMatrix SM; SM << (UM + UM.t());
145   BandMatrix BM(4, 1, 2);  BM.Inject(M);
146   DiagonalMatrix DM; DM << M;
147   SymmetricBandMatrix SBM(4,1); SBM.Inject(M);
148   RowVector Test(28); int k = 0;
149
150   // tests for different shapes
151   Test(++k) = TestMax(GenericMatrix(M));
152   Test(++k) = TestMax(GenericMatrix(UM));
153   Test(++k) = TestMax(GenericMatrix(LM));
154   Test(++k) = TestMax(GenericMatrix(SM));
155   Test(++k) = TestMax(GenericMatrix(DM));
156   Test(++k) = TestMax(GenericMatrix(BM));
157   Test(++k) = TestMax(GenericMatrix(SBM));
158
159   // tests for constant matrices - don't put non-zeros in corners of BM
160   Matrix MX(4,4);
161   MX = 1; Test(++k) = TestMax(GenericMatrix(MX));
162   BM.Inject(MX); Test(++k) = TestMax(GenericMatrix(BM));
163   MX = 0; Test(++k) = TestMax(GenericMatrix(MX));
164   BM.Inject(MX); Test(++k) = TestMax(GenericMatrix(BM));
165   MX = -1; Test(++k) = TestMax(GenericMatrix(MX));
166   BM.Inject(MX); Test(++k) = TestMax(GenericMatrix(BM));
167
168   // test for non-square
169   MX = M | (2 * M).t(); Test(++k) = TestMax(GenericMatrix(MX));
170
171   // test on row and column vector
172   RowVector RV(6);
173   RV << 1 << 3 << -5 << 2 << -4 << 3;
174   Test(++k) = TestMax(GenericMatrix(RV));
175   Test(++k) = TestMax(GenericMatrix(RV.t()));
176
177   // test for function form
178   Test(++k) = (MaximumAbsoluteValue(RV) - 5);
179   Test(++k) = (MinimumAbsoluteValue(RV) - 1);
180   Test(++k) = (Maximum(RV) - 3);
181   Test(++k) = (Minimum(RV) + 5);
182   Test(++k) = (MaximumAbsoluteValue(-RV) - 5);
183   Test(++k) = (MinimumAbsoluteValue(-RV) - 1);
184   Test(++k) = (Maximum(-RV) - 5);
185   Test(++k) = (Minimum(-RV) + 3);
186
187   // test formulae
188   RowVector RV2(6);
189   RV2 << 2 << 8 << 1 << 9 << 3 << -1;
190   Test(++k) = (MaximumAbsoluteValue(RV+RV2) - 11);
191   Test(++k) = (MinimumAbsoluteValue(RV+RV2) - 1);
192   Test(++k) = (Maximum(RV+RV2) - 11);
193   Test(++k) = (Minimum(RV+RV2) + 4);
194
195
196   Print(Test);
197}
198
Note: See TracBrowser for help on using the repository browser.