00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "matrixwrapper_test.hpp"
00021 #include "approxEqual.hpp"
00022
00023
00024
00025 CPPUNIT_TEST_SUITE_REGISTRATION( MatrixwrapperTest );
00026
00027 using namespace MatrixWrapper;
00028
00029
00030 void
00031 MatrixwrapperTest::setUp()
00032 {
00033 }
00034
00035
00036 void
00037 MatrixwrapperTest::tearDown()
00038 {
00039 }
00040
00041 void
00042 MatrixwrapperTest::testMatrixwrapperValue()
00043 {
00044 double epsilon = 0.00001;
00045
00046 unsigned int one = 1;
00047 unsigned int r = 4;
00048 unsigned int c = 3;
00049
00050
00051 vector< vector<double> > REF;
00052 for (unsigned int i=0; i<r+c; i++){
00053 vector<double> row;
00054 for (unsigned int j=0; j<r+c; j++)
00055 row.push_back( (r+c)*i+j );
00056 REF.push_back(row);
00057 }
00058
00059
00060
00061
00062 Matrix Am(r,c);
00063
00064 CPPUNIT_ASSERT_EQUAL(Am.rows(), r);
00065
00066 CPPUNIT_ASSERT_EQUAL(Am.columns(), c);
00067
00068 SymmetricMatrix As(r);
00069
00070 CPPUNIT_ASSERT_EQUAL(As.rows(), r);
00071
00072 CPPUNIT_ASSERT_EQUAL(As.columns(), r);
00073
00074 ColumnVector Ac(r);
00075
00076 CPPUNIT_ASSERT_EQUAL(Ac.rows(), r);
00077
00078 CPPUNIT_ASSERT_EQUAL(Ac.columns(), one);
00079
00080 RowVector Ar(c);
00081
00082 CPPUNIT_ASSERT_EQUAL(Ar.rows(), one);
00083
00084 CPPUNIT_ASSERT_EQUAL(Ar.columns(), c);
00085
00086
00087 double v = 3.5;
00088 Am = v; As = v; Ac = v; Ar = v;
00089
00090 for (unsigned int i=0; i<r; i++)
00091 for (unsigned int j=0; j<c; j++)
00092 CPPUNIT_ASSERT_EQUAL(Am(i+1,j+1), v);
00093
00094 for (unsigned int i=0; i<r; i++)
00095 for (unsigned int j=0; j<r; j++)
00096 CPPUNIT_ASSERT_EQUAL(As(i+1,j+1), v);
00097
00098 for (unsigned int i=0; i<r; i++)
00099 CPPUNIT_ASSERT_EQUAL(Ac(i+1), v);
00100
00101 for (unsigned int i=0; i<c; i++)
00102 CPPUNIT_ASSERT_EQUAL(Ar(i+1), v);
00103
00104
00105
00106 Matrix Bm(r,c);
00107 for (unsigned int i=0; i<r; i++){
00108 for (unsigned int j=0; j<c; j++){
00109 Bm(i+1,j+1) = REF[i][j];
00110 CPPUNIT_ASSERT_EQUAL(Bm(i+1,j+1), REF[i][j]);
00111 }
00112 }
00113
00114
00115 SymmetricMatrix Bs(r);
00116 for (unsigned int i=0; i<r; i++){
00117 for (unsigned int j=0; j<=i; j++){
00118 Bs(j+1,i+1) = REF[i][j];
00119 CPPUNIT_ASSERT_EQUAL(Bs(i+1,j+1), REF[i][j]);
00120 CPPUNIT_ASSERT_EQUAL(Bs(j+1,i+1), REF[i][j]);
00121 }
00122 }
00123 for (unsigned int i=0; i<r; i++){
00124 for (unsigned int j=0; j<=i; j++){
00125 Bs(i+1,j+1) = REF[i][j];
00126 CPPUNIT_ASSERT_EQUAL(Bs(i+1,j+1), REF[i][j]);
00127 CPPUNIT_ASSERT_EQUAL(Bs(j+1,i+1), REF[i][j]);
00128 }
00129 }
00130
00131 ColumnVector Bc(r);
00132 for (unsigned int i=0; i<r; i++){
00133 Bc(i+1) = REF[0][i];
00134 CPPUNIT_ASSERT_EQUAL(Bc(i+1), REF[0][i]);
00135 }
00136
00137 RowVector Br(c);
00138 for (unsigned int i=0; i<c; i++){
00139 Br(i+1) = REF[0][i];
00140 CPPUNIT_ASSERT_EQUAL(Br(i+1), REF[0][i]);
00141 }
00142
00143
00144
00145 Am = Bm;
00146 for (unsigned int i=0; i<r; i++){
00147 for (unsigned int j=0; j<c; j++){
00148 CPPUNIT_ASSERT_EQUAL(Am(i+1,j+1), REF[i][j]);
00149 CPPUNIT_ASSERT_EQUAL(Bm(i+1,j+1), REF[i][j]);
00150 }
00151 }
00152
00153 As = Bs;
00154 for (unsigned int i=0; i<r; i++){
00155 for (unsigned int j=0; j<=i; j++){
00156 CPPUNIT_ASSERT_EQUAL(As(i+1,j+1), REF[i][j]);
00157 CPPUNIT_ASSERT_EQUAL(Bs(i+1,j+1), REF[i][j]);
00158 CPPUNIT_ASSERT_EQUAL(As(j+1,i+1), REF[i][j]);
00159 CPPUNIT_ASSERT_EQUAL(Bs(j+1,i+1), REF[i][j]);
00160 }
00161 }
00162
00163 Ac = Bc;
00164 for (unsigned int i=0; i<r; i++){
00165 CPPUNIT_ASSERT_EQUAL(Ac(i+1), REF[0][i]);
00166 CPPUNIT_ASSERT_EQUAL(Bc(i+1), REF[0][i]);
00167 }
00168
00169 Ar = Br;
00170 for (unsigned int i=0; i<c; i++){
00171 CPPUNIT_ASSERT_EQUAL(Ar(i+1), REF[0][i]);
00172 CPPUNIT_ASSERT_EQUAL(Br(i+1), REF[0][i]);
00173 }
00174
00175
00176
00177
00178
00179 Matrix Km(r+2,c+2); Km = v;
00180 Matrix Km_resize(r,c); Km_resize = v;
00181 CPPUNIT_ASSERT_EQUAL(Km.rows(), r+2);
00182 CPPUNIT_ASSERT_EQUAL(Km.columns(), c+2);
00183 Km.resize(r,c);
00184 CPPUNIT_ASSERT_EQUAL(Km.rows(), r);
00185 CPPUNIT_ASSERT_EQUAL(Km.columns(), c);
00186 CPPUNIT_ASSERT_EQUAL(Km, Km_resize);
00187
00188 SymmetricMatrix Ks(r+2); Ks = v;
00189 SymmetricMatrix Ks_resize(r); Ks_resize = v;
00190 CPPUNIT_ASSERT_EQUAL(Ks.rows(), r+2);
00191 CPPUNIT_ASSERT_EQUAL(Ks.columns(), r+2);
00192
00193
00194
00195
00196
00197 ColumnVector Kc(r+2); Kc = v;
00198 ColumnVector Kc_resize(r); Kc_resize = v;
00199 CPPUNIT_ASSERT_EQUAL(Kc.rows(), r+2);
00200 Kc.resize(r);
00201 CPPUNIT_ASSERT_EQUAL(Kc.rows(), r);
00202 CPPUNIT_ASSERT_EQUAL(Kc, Kc_resize);
00203
00204 RowVector Kr(c+2); Kr = v;
00205 RowVector Kr_resize(c); Kr_resize = v;
00206 CPPUNIT_ASSERT_EQUAL(Kr.columns(), c+2);
00207 Kr.resize(c);
00208 CPPUNIT_ASSERT_EQUAL(Kr.columns(), c);
00209 CPPUNIT_ASSERT_EQUAL(Kr, Kr_resize);
00210
00211
00212
00213 Matrix Bm_eq; Bm_eq = Bm;
00214 CPPUNIT_ASSERT_EQUAL(Bm_eq == Bm, true);
00215 Bm(1,1) = Bm(1,1) + v;
00216 CPPUNIT_ASSERT_EQUAL(Bm == Bm_eq, false);
00217 Matrix Bm_res(Bm.rows(), Bm.columns()+1);
00218 CPPUNIT_ASSERT_EQUAL(Bm == Bm_res, false);
00219 Bm_res = Bm;
00220 CPPUNIT_ASSERT_EQUAL(Bm == Bm_res, true);
00221
00222 SymmetricMatrix Bs_eq; Bs_eq = Bs;
00223 CPPUNIT_ASSERT_EQUAL(Bs_eq == Bs, true);
00224 Bs(1,1) = Bs(1,1) + v;
00225 CPPUNIT_ASSERT_EQUAL(Bs == Bs_eq, false);
00226 SymmetricMatrix Bs_res(Bs.columns()+1);
00227 CPPUNIT_ASSERT_EQUAL(Bs == Bs_res, false);
00228 Bs_res = Bs;
00229 CPPUNIT_ASSERT_EQUAL(Bs == Bs_res, true);
00230
00231 ColumnVector Bc_eq; Bc_eq = Bc;
00232 CPPUNIT_ASSERT_EQUAL(Bc_eq == Bc, true);
00233 Bc(1) = Bc(1) + v;
00234 CPPUNIT_ASSERT_EQUAL(Bc == Bc_eq, false);
00235 ColumnVector Bc_res(Bc.rows()+1);
00236 CPPUNIT_ASSERT_EQUAL(Bc == Bc_res, false);
00237 Bc_res = Bc;
00238 CPPUNIT_ASSERT_EQUAL(Bc == Bc_res, true);
00239
00240 RowVector Br_eq; Br_eq = Br;
00241 CPPUNIT_ASSERT_EQUAL(Br_eq == Br, true);
00242 Br(1) = Br(1) + v;
00243 CPPUNIT_ASSERT_EQUAL(Br == Br_eq, false);
00244 RowVector Br_res(Br.columns()+1);
00245 CPPUNIT_ASSERT_EQUAL(Br == Br_res, false);
00246 Br_res = Br;
00247 CPPUNIT_ASSERT_EQUAL(Br == Br_res, true);
00248
00249
00250
00251
00252 Matrix Am_trans = Am.transpose();
00253 CPPUNIT_ASSERT_EQUAL(Am.rows(), Am_trans.columns());
00254 CPPUNIT_ASSERT_EQUAL(Am.columns(), Am_trans.rows());
00255 for (unsigned int i=0; i<r; i++){
00256 for (unsigned int j=0; j<c; j++){
00257 CPPUNIT_ASSERT_EQUAL(Am(i+1,j+1), REF[i][j]);
00258 CPPUNIT_ASSERT_EQUAL(Am_trans(j+1,i+1), REF[i][j]);
00259 }
00260 }
00261
00262 SymmetricMatrix As_trans = As.transpose();
00263 CPPUNIT_ASSERT_EQUAL(As.rows(), As_trans.columns());
00264 CPPUNIT_ASSERT_EQUAL(As.columns(), As_trans.rows());
00265 for (unsigned int i=0; i<r; i++){
00266 for (unsigned int j=0; j<=i; j++){
00267 CPPUNIT_ASSERT_EQUAL(As(i+1,j+1), REF[i][j]);
00268 CPPUNIT_ASSERT_EQUAL(As_trans(j+1,i+1), REF[i][j]);
00269 CPPUNIT_ASSERT_EQUAL(As(j+1,i+1), REF[i][j]);
00270 CPPUNIT_ASSERT_EQUAL(As_trans(i+1,j+1), REF[i][j]);
00271 }
00272 }
00273
00274 RowVector Ac_trans = Ac.transpose();
00275 CPPUNIT_ASSERT_EQUAL(Ac.rows(), Ac_trans.columns());
00276 CPPUNIT_ASSERT_EQUAL(Ac.columns(), Ac_trans.rows());
00277 for (unsigned int i=0; i<r; i++){
00278 CPPUNIT_ASSERT_EQUAL(Ac(i+1), REF[0][i]);
00279 CPPUNIT_ASSERT_EQUAL(Ac_trans(i+1), REF[0][i]);
00280 }
00281
00282 ColumnVector Ar_trans = Ar.transpose();
00283 CPPUNIT_ASSERT_EQUAL(Ar.rows(), Ar_trans.columns());
00284 CPPUNIT_ASSERT_EQUAL(Ar.columns(), Ar_trans.rows());
00285 for (unsigned int i=0; i<c; i++){
00286 CPPUNIT_ASSERT_EQUAL(Ar(i+1), REF[0][i]);
00287 CPPUNIT_ASSERT_EQUAL(Ar_trans(i+1), REF[0][i]);
00288 }
00289
00290
00291
00292 Matrix Am_sub = Am.sub(2,r,2,c);
00293 CPPUNIT_ASSERT_EQUAL(Am_sub.rows(), r-1);
00294 CPPUNIT_ASSERT_EQUAL(Am_sub.columns(), c-1);
00295 for (unsigned int i=0; i<c-1; i++){
00296 for (unsigned int j=0; j<c-1; j++){
00297 CPPUNIT_ASSERT_EQUAL(Am_sub(i+1,j+1), Am(i+2,j+2));
00298 CPPUNIT_ASSERT_EQUAL(Am_sub(i+1,j+1), REF[i+1][j+1]);
00299 }
00300 }
00301
00302 Matrix As_sub = As.sub(2,c,2,c);
00303 CPPUNIT_ASSERT_EQUAL(As_sub.rows(), c-1);
00304 CPPUNIT_ASSERT_EQUAL(As_sub.columns(), c-1);
00305 for (unsigned int i=0; i<c-1; i++){
00306 for (unsigned int j=0; j<=i; j++){
00307 CPPUNIT_ASSERT_EQUAL(As_sub(i+1,j+1), As(i+2,j+2));
00308 CPPUNIT_ASSERT_EQUAL(As_sub(i+1,j+1), REF[i+1][j+1]);
00309 CPPUNIT_ASSERT_EQUAL(As_sub(j+1,i+1), As(i+2,j+2));
00310 CPPUNIT_ASSERT_EQUAL(As_sub(j+1,i+1), REF[i+1][j+1]);
00311 }
00312 }
00313
00314 ColumnVector Ac_sub = Ac.sub(2,c);
00315 CPPUNIT_ASSERT_EQUAL(Ac_sub.rows(), c-1);
00316 CPPUNIT_ASSERT_EQUAL(Ac_sub.columns(), one);
00317 for (unsigned int i=0; i<c-1; i++){
00318 CPPUNIT_ASSERT_EQUAL(Ac_sub(i+1), Ac(i+2));
00319 CPPUNIT_ASSERT_EQUAL(Ac_sub(i+1), REF[0][i+1]);
00320 }
00321
00322 RowVector Ar_sub = Ar.sub(2,r-1);
00323 CPPUNIT_ASSERT_EQUAL(Ar_sub.rows(), one);
00324 CPPUNIT_ASSERT_EQUAL(Ar_sub.columns(), r-2);
00325 for (unsigned int i=0; i<r-2; i++){
00326 CPPUNIT_ASSERT_EQUAL(Ar_sub(i+1), Ar(i+2));
00327 CPPUNIT_ASSERT_EQUAL(Ar_sub(i+1), REF[0][i+1]);
00328 }
00329
00330
00331
00332 Matrix Cm = Am * Am_trans;
00333 Matrix Cm_check(r,c);
00334 for (unsigned int i=0; i<r; i++){
00335 for (unsigned int j=0; j<c; j++){
00336
00337 CPPUNIT_ASSERT_EQUAL(Am(i+1,j+1), REF[i][j]);
00338 CPPUNIT_ASSERT_EQUAL(Am_trans(j+1,i+1), REF[i][j]);
00339
00340 double sum = 0.0;
00341 for (unsigned int t=0; t<c; t++){
00342 sum += Am(i+1,t+1) * Am_trans(t+1,j+1);
00343 }
00344 Cm_check(i+1,j+1) = sum;
00345 CPPUNIT_ASSERT_EQUAL(Cm(i+1,j+1), Cm_check(i+1,j+1));
00346 }
00347 }
00348
00349
00350 Cm = Am * v;
00351 for (unsigned int i=0; i<r; i++){
00352 for (unsigned int j=0; j<c; j++){
00353
00354 CPPUNIT_ASSERT_EQUAL(Am(i+1,j+1), REF[i][j]);
00355 CPPUNIT_ASSERT_EQUAL(Am_trans(j+1,i+1), REF[i][j]);
00356
00357 CPPUNIT_ASSERT_EQUAL(Cm(i+1,j+1), REF[i][j] * v);
00358 }
00359 }
00360
00361
00362 Matrix Cs_check(r,r);
00363 Matrix Cs = As * As_trans;
00364 for (unsigned int i=0; i<r; i++){
00365 for (unsigned int j=0; j<=i; j++){
00366
00367 CPPUNIT_ASSERT_EQUAL(As(i+1,j+1), REF[i][j]);
00368 CPPUNIT_ASSERT_EQUAL(As_trans(j+1,i+1), REF[i][j]);
00369 CPPUNIT_ASSERT_EQUAL(As(j+1,i+1), REF[i][j]);
00370 CPPUNIT_ASSERT_EQUAL(As_trans(i+1,j+1), REF[i][j]);
00371
00372 double sum = 0.0;
00373 for (unsigned int t=0; t<r; t++){
00374 sum += As(i+1,t+1) * As_trans(t+1,j+1);
00375 }
00376 Cs_check(i+1,j+1) = sum;
00377 CPPUNIT_ASSERT_EQUAL(Cs(i+1,j+1), Cs_check(i+1,j+1));
00378 }
00379 }
00380
00381
00382 Cs = As * v;
00383 for (unsigned int i=0; i<r; i++){
00384 for (unsigned int j=0; j<=i; j++){
00385
00386 CPPUNIT_ASSERT_EQUAL(As(i+1,j+1), REF[i][j]);
00387 CPPUNIT_ASSERT_EQUAL(As(j+1,i+1), REF[i][j]);
00388
00389 CPPUNIT_ASSERT_EQUAL(Cs(i+1,j+1), REF[i][j] * v);
00390 CPPUNIT_ASSERT_EQUAL(Cs(j+1,i+1), REF[i][j] * v);
00391 }
00392 }
00393
00394
00395
00396
00397
00398 Matrix Csm_check(r,c);
00399 Matrix Csm = As * Am;
00400 for (unsigned int i=0; i<r; i++){
00401 for (unsigned int j=0; j<c; j++){
00402
00403 if (j<=i){
00404 CPPUNIT_ASSERT_EQUAL(As(i+1,j+1), REF[i][j]);
00405 CPPUNIT_ASSERT_EQUAL(As(j+1,i+1), REF[i][j]);
00406 }
00407 CPPUNIT_ASSERT_EQUAL(Am(i+1,j+1), REF[i][j]);
00408
00409 double sum = 0.0;
00410 for (unsigned int t=0; t<r; t++){
00411 sum += As(i+1,t+1) * Am(t+1,j+1);
00412 }
00413 Csm_check(i+1,j+1) = sum;
00414 CPPUNIT_ASSERT_EQUAL(Csm(i+1,j+1), Csm_check(i+1,j+1));
00415 }
00416 }
00417
00418
00419 ColumnVector Cc = Ac * v;
00420 for (unsigned int i=0; i<r; i++){
00421
00422 CPPUNIT_ASSERT_EQUAL(Ac(i+1), REF[0][i]);
00423
00424 CPPUNIT_ASSERT_EQUAL(Cc(i+1), REF[0][i] * v);
00425 }
00426
00427
00428 RowVector Cr = Ar * v;
00429 for (unsigned int i=0; i<c; i++){
00430
00431 CPPUNIT_ASSERT_EQUAL(Ar(i+1), REF[0][i]);
00432
00433 CPPUNIT_ASSERT_EQUAL(Cr(i+1), REF[0][i] * v);
00434 }
00435
00436
00437 Matrix Ccr = Ac * Ar;
00438 Matrix Ccr_check(r,c);
00439 for (unsigned int j=0; j<c; j++) CPPUNIT_ASSERT_EQUAL(Ar(j+1), REF[0][j]);
00440 for (unsigned int i=0; i<r; i++){
00441
00442 CPPUNIT_ASSERT_EQUAL(Ac(i+1), REF[0][i]);
00443 for (unsigned int j=0; j<c; j++){
00444
00445 Ccr_check(i+1,j+1) = Ac(i+1) * Ar(j+1);
00446 CPPUNIT_ASSERT_EQUAL(Ccr(i+1,j+1), Ccr_check(i+1,j+1));
00447 }
00448 }
00449
00450
00451 double rc = Ac_trans * Ac;
00452 double rc_check;
00453
00454 for (unsigned int j=0; j<c; j++) CPPUNIT_ASSERT_EQUAL(Ac_trans(j+1), REF[0][j]);
00455 for (unsigned int i=0; i<r; i++) CPPUNIT_ASSERT_EQUAL(Ac(i+1), REF[0][i]);
00456
00457 double sum = 0.0;
00458 for (unsigned int t=0; t<r; t++){
00459 sum += Ac_trans(t+1) * Ac(t+1);
00460 }
00461 rc_check = sum;
00462 CPPUNIT_ASSERT_EQUAL(rc, rc_check);
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487 ColumnVector Cc2= Am_trans * Ac;
00488 ColumnVector Cc2_check(c);
00489 for (unsigned int j=0; j<r; j++){
00490
00491 CPPUNIT_ASSERT_EQUAL(Ac(j+1), REF[0][j]);
00492 for (unsigned int i=0; i<c; i++){
00493
00494 CPPUNIT_ASSERT_EQUAL(Am_trans(i+1,j+1), REF[j][i]);
00495 }
00496 }
00497 for (unsigned int i=0; i<c; i++){
00498
00499 double sum = 0.0;
00500 for (unsigned int t=0; t<r; t++){
00501 sum += Am_trans(i+1,t+1) * Ac(t+1);
00502 }
00503 Cc2_check(i+1) = sum;
00504 CPPUNIT_ASSERT_EQUAL(Cc2(i+1), Cc2_check(i+1));
00505 }
00506
00507
00508
00509 Cm = Am / v;
00510 for (unsigned int i=0; i<r; i++){
00511 for (unsigned int j=0; j<c; j++){
00512
00513 CPPUNIT_ASSERT_EQUAL(approxEqual(Cm(i+1,j+1), REF[i][j] / v,epsilon),true);
00514 }
00515 }
00516 Cs = As / v;
00517 for (unsigned int i=0; i<r; i++){
00518 for (unsigned int j=0; j<=i; j++){
00519 CPPUNIT_ASSERT_EQUAL(Cs(i+1,j+1), REF[i][j] / v);
00520 CPPUNIT_ASSERT_EQUAL(Cs(j+1,i+1), REF[i][j] / v);
00521 }
00522 }
00523 Cc = Ac / v;
00524 for (unsigned int i=0; i<r; i++)
00525 CPPUNIT_ASSERT_EQUAL(Cc(i+1), REF[0][i] / v);
00526 Cr = Ar / v;
00527 for (unsigned int i=0; i<c; i++)
00528 CPPUNIT_ASSERT_EQUAL(Cr(i+1), REF[0][i] / v);
00529
00530
00531 Matrix Rm(c,c);
00532 Rm(1,1) = 3; Rm(1,2) = 3; Rm(1,3) = 3;
00533 Rm(2,1) = 5; Rm(2,2) = 2; Rm(2,3) = 9;
00534 Rm(3,1) = 9; Rm(3,2) = 7; Rm(3,3) = 0;
00535 Matrix Rm_inv = Rm.inverse();
00536 Matrix Im(c,c); Im = 0;
00537 for (unsigned int i=0; i<c; i++)
00538 Im(i+1,i+1) = 1;
00539 Matrix Im_test = Rm * Rm_inv;
00540 CPPUNIT_ASSERT_EQUAL(approxEqual(Im_test, Im, epsilon),true);
00541
00542 Matrix Rs(c,c);
00543 Rs(1,1) = 3; Rs(1,2) = 5; Rs(1,3) = 3;
00544 Rs(2,1) = 5; Rs(2,2) = 2; Rs(2,3) = 7;
00545 Rs(3,1) = 3; Rs(3,2) = 7; Rs(3,3) = 0;
00546 Matrix Rs_inv = Rs.inverse();
00547 Matrix Is(c,c); Is = 0;
00548 for (unsigned int i=0; i<c; i++)
00549 Is(i+1,i+1) = 1;
00550 Matrix Is_test = Rs * Rs_inv;
00551 CPPUNIT_ASSERT_EQUAL(approxEqual(Is_test, Is, epsilon),true);
00552
00553
00554 CPPUNIT_ASSERT_EQUAL(approxEqual(Rm.determinant(), 105, epsilon),true);
00555 CPPUNIT_ASSERT_EQUAL(approxEqual(Rs.determinant(), 45, epsilon),true);
00556
00557
00558 SymmetricMatrix Ps(c);
00559 Ps(1,1) = 3; Ps(1,2) = 2; Ps(1,3) = 1;
00560 Ps(2,1) = 2; Ps(2,2) = 2; Ps(2,3) = 1;
00561 Ps(3,1) = 1; Ps(3,2) = 1; Ps(3,3) = 1;
00562 Matrix CHs;
00563 Matrix CHs_check(c,c);
00564 CHs_check(1,1) = 1.73205; CHs_check(1,2) = 0.00000; CHs_check(1,3) = 0.00000;
00565 CHs_check(2,1) = 1.15470; CHs_check(2,2) = 0.81650; CHs_check(2,3) = 0.00000;
00566 CHs_check(3,1) = 0.57735; CHs_check(3,2) = 0.40825; CHs_check(3,3) = 0.70711;
00567 Ps.cholesky_semidefinite(CHs);
00568 CPPUNIT_ASSERT_EQUAL(approxEqual(CHs, CHs_check, epsilon),true);
00569
00570
00571 Matrix Rm_bak; Rm_bak = Rm;
00572 Matrix Dm(c,c); Dm = v;
00573 Matrix Em = Rm - Dm;
00574 Matrix Fm = Rm - v;
00575 Matrix Gm(Rm);
00576 Gm -= Dm;
00577 Matrix Hm; Hm = Rm;
00578 Hm -= v;
00579 CPPUNIT_ASSERT_EQUAL(Rm, Rm_bak);
00580 CPPUNIT_ASSERT_EQUAL( Em, Fm);
00581 CPPUNIT_ASSERT_EQUAL( Fm, Gm);
00582 CPPUNIT_ASSERT_EQUAL( Gm, Hm);
00583 for (unsigned int i=0; i<c; i++)
00584 for (unsigned int j=0; j<c; j++)
00585 CPPUNIT_ASSERT_EQUAL( Dm(i+1,j+1), v);
00586
00587
00588 Matrix Bm_bak; Bm_bak = Bm;
00589 Matrix Bm_pinv = Bm.pseudoinverse();
00590 CPPUNIT_ASSERT_EQUAL(Bm, Bm_bak);
00591 Im_test = Bm_pinv * Bm;
00592 CPPUNIT_ASSERT_EQUAL(approxEqual(Im_test, Im, epsilon),true);
00593
00594
00595 int rows = 4;
00596 int cols = 3;
00597 Matrix A_svd(rows,cols);
00598 Matrix W_svd(cols,cols);
00599 Matrix U_svd,V_svd;
00600 W_svd = 0.0;
00601
00602 ColumnVector w_svd;
00603 A_svd(1,1)=1; A_svd(2,2)=2; A_svd(3,3)=3;
00604 A_svd(1,2)=-0.5; A_svd(1,3)=-0.8;
00605 A_svd(2,1)=-1.5; A_svd(2,3)=-2.8;
00606 A_svd(3,1)=2.5; A_svd(3,2)=0.8;
00607 A_svd(4,1)=0.5; A_svd(4,2)=1.8; A_svd(4,3)=1.6 ;
00608
00609 A_svd.SVD(w_svd,U_svd,V_svd);
00610 for (int i=1; i<=A_svd.columns() ; i++) W_svd(i,i) = w_svd(i);
00611 CPPUNIT_ASSERT_EQUAL(approxEqual(A_svd, U_svd * W_svd * V_svd.transpose(), epsilon),true);
00612
00613 int rows2 = 3;
00614 int cols2 = 4;
00615 Matrix A2_svd(rows2,cols2);
00616 Matrix W2_svd(cols2,cols2);
00617 Matrix U2_svd,V2_svd;
00618 W2_svd = 0.0;
00619
00620 ColumnVector w2_svd;
00621 A2_svd(1,1)=1; A2_svd(2,2)=2; A2_svd(3,3)=3;
00622 A2_svd(1,2)=-0.5; A2_svd(1,3)=-0.8; A2_svd(1,4)=-0.1 ;
00623 A2_svd(2,1)=-1.5; A2_svd(2,3)=-2.8; A2_svd(2,4)=3.1 ;
00624 A2_svd(3,1)=2.5; A2_svd(3,2)=-0.8; A2_svd(3,4)=1.1 ;
00625
00626 A2_svd.SVD(w2_svd,U2_svd,V2_svd);
00627 for (int i=1; i<=A2_svd.columns() ; i++) W2_svd(i,i) = w2_svd(i);
00628 CPPUNIT_ASSERT_EQUAL(approxEqual(A2_svd, U2_svd * W2_svd * V2_svd.transpose(), epsilon),true);
00629
00630
00631
00632 Matrix M1(1,1);
00633 M1(1,1)= 1.4;
00634 Matrix M1_inv = M1.inverse();
00635 Matrix I1(1,1);
00636 I1(1,1)= 1.0;
00637 CPPUNIT_ASSERT_EQUAL(M1_inv * M1, I1);
00638
00639 Matrix M2(2,2);
00640 M2(1,1)= 1.4;
00641 M2(2,2)= 0.4;
00642 M2(1,2)= 2.1;
00643 M2(2,1)= -0.8;
00644 Matrix M2_inv = M2.inverse();
00645 Matrix I2(2,2);
00646 I2=0.0;
00647 I2(1,1)= 1.0;
00648 I2(2,2)= 1.0;
00649 CPPUNIT_ASSERT_EQUAL(approxEqual(M2_inv * M2, I2,epsilon),true);
00650
00651 CPPUNIT_ASSERT_EQUAL(M1.determinant(), M1(1,1));
00652
00653 CPPUNIT_ASSERT_EQUAL(M2.determinant(), M2(1,1)*M2(2,2)-M2(1,2)*M2(2,1));
00654
00655 SymmetricMatrix SM1(1);
00656 SM1(1,1)= 1.4;
00657 SymmetricMatrix SM1_inv = SM1.inverse();
00658 CPPUNIT_ASSERT_EQUAL(Matrix(SM1_inv * SM1), I1);
00659
00660 SymmetricMatrix SM2(2);
00661 SM2(1,1)= 1.4;
00662 SM2(2,2)= 0.4;
00663 SM2(1,2)= 2.1;
00664 SM2(2,1)= -0.8;
00665 SymmetricMatrix SM2_inv = SM2.inverse();
00666 CPPUNIT_ASSERT_EQUAL(approxEqual(Matrix(SM2_inv * SM2), I2,epsilon),true);
00667
00668 CPPUNIT_ASSERT_EQUAL(SM1.determinant(), SM1(1,1));
00669
00670 CPPUNIT_ASSERT_EQUAL(SM2.determinant(), SM2(1,1)*SM2(2,2)-SM2(1,2)*SM2(2,1));
00671
00672 Matrix M3(3,3);
00673 M3(1,1)=1;
00674 M3(1,2)=2;
00675 M3(1,3)=3;
00676 M3(2,1)=4;
00677 M3(2,2)=5;
00678 M3(2,3)=6;
00679 M3(3,1)=7;
00680 M3(3,2)=8;
00681 M3(3,3)=9;
00682
00683 RowVector rcopy1 = M3.rowCopy(1);
00684 RowVector rcopy1test(3);
00685 rcopy1test(1) = M3(1,1);
00686 rcopy1test(2) = M3(1,2);
00687 rcopy1test(3) = M3(1,3);
00688 CPPUNIT_ASSERT_EQUAL(rcopy1,rcopy1test);
00689 RowVector rcopy2 = M3.rowCopy(2);
00690 RowVector rcopy2test(3);
00691 rcopy2test(1) = M3(2,1);
00692 rcopy2test(2) = M3(2,2);
00693 rcopy2test(3) = M3(2,3);
00694 CPPUNIT_ASSERT_EQUAL(rcopy2,rcopy2test);
00695 RowVector rcopy3 = M3.rowCopy(3);
00696 RowVector rcopy3test(3);
00697 rcopy3test(1) = M3(3,1);
00698 rcopy3test(2) = M3(3,2);
00699 rcopy3test(3) = M3(3,3);
00700 CPPUNIT_ASSERT_EQUAL(rcopy3,rcopy3test);
00701
00702
00703 ColumnVector copy1 = M3.columnCopy(1);
00704 ColumnVector copy1test(3);
00705 copy1test(1) = M3(1,1);
00706 copy1test(2) = M3(2,1);
00707 copy1test(3) = M3(3,1);
00708 CPPUNIT_ASSERT_EQUAL(copy1,copy1test);
00709 ColumnVector copy2 = M3.columnCopy(2);
00710 ColumnVector copy2test(3);
00711 copy2test(1) = M3(1,2);
00712 copy2test(2) = M3(2,2);
00713 copy2test(3) = M3(3,2);
00714 CPPUNIT_ASSERT_EQUAL(copy2,copy2test);
00715 ColumnVector copy3 = M3.columnCopy(3);
00716 ColumnVector copy3test(3);
00717 copy3test(1) = M3(1,3);
00718 copy3test(2) = M3(2,3);
00719 copy3test(3) = M3(3,3);
00720 CPPUNIT_ASSERT_EQUAL(copy3,copy3test);
00721 }
00722
00723
00724