comparison UnitTestsSources/UnitTestsMain.cpp @ 163:8c5b24892ed2 wasm

LinearAlgebra::InvertMatrix
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 14 Feb 2018 14:26:26 +0100
parents 77715c340767
children 432b1f812d14
comparison
equal deleted inserted replaced
162:77715c340767 163:8c5b24892ed2
435 ASSERT_NEAR(cy[i], y + 256, 0.01); 435 ASSERT_NEAR(cy[i], y + 256, 0.01);
436 } 436 }
437 } 437 }
438 438
439 439
440 TEST(Matrix, Inverse1)
441 {
442 OrthancStone::Matrix a, b;
443
444 ASSERT_THROW(OrthancStone::LinearAlgebra::InvertMatrix(b, a), Orthanc::OrthancException);
445
446 a.resize(2, 3);
447 ASSERT_THROW(OrthancStone::LinearAlgebra::InvertMatrix(b, a), Orthanc::OrthancException);
448
449 a.resize(1, 1);
450 a(0, 0) = 45.0;
451
452 ASSERT_DOUBLE_EQ(45, OrthancStone::LinearAlgebra::ComputeDeterminant(a));
453 OrthancStone::LinearAlgebra::InvertMatrix(b, a);
454 ASSERT_EQ(1u, b.size1());
455 ASSERT_EQ(1u, b.size2());
456 ASSERT_DOUBLE_EQ(1.0 / 45.0, b(0, 0));
457
458 a(0, 0) = 0;
459 ASSERT_DOUBLE_EQ(0, OrthancStone::LinearAlgebra::ComputeDeterminant(a));
460 ASSERT_THROW(OrthancStone::LinearAlgebra::InvertMatrix(b, a), Orthanc::OrthancException);
461 }
462
463
464 TEST(Matrix, Inverse2)
465 {
466 OrthancStone::Matrix a, b;
467 a.resize(2, 2);
468 a(0, 0) = 4;
469 a(0, 1) = 3;
470 a(1, 0) = 3;
471 a(1, 1) = 2;
472
473 ASSERT_DOUBLE_EQ(-1, OrthancStone::LinearAlgebra::ComputeDeterminant(a));
474 OrthancStone::LinearAlgebra::InvertMatrix(b, a);
475 ASSERT_EQ(2u, b.size1());
476 ASSERT_EQ(2u, b.size2());
477
478 ASSERT_DOUBLE_EQ(-2, b(0, 0));
479 ASSERT_DOUBLE_EQ(3, b(0, 1));
480 ASSERT_DOUBLE_EQ(3, b(1, 0));
481 ASSERT_DOUBLE_EQ(-4, b(1, 1));
482
483 a(0, 0) = 1;
484 a(0, 1) = 2;
485 a(1, 0) = 3;
486 a(1, 1) = 4;
487
488 ASSERT_DOUBLE_EQ(-2, OrthancStone::LinearAlgebra::ComputeDeterminant(a));
489 OrthancStone::LinearAlgebra::InvertMatrix(b, a);
490
491 ASSERT_DOUBLE_EQ(-2, b(0, 0));
492 ASSERT_DOUBLE_EQ(1, b(0, 1));
493 ASSERT_DOUBLE_EQ(1.5, b(1, 0));
494 ASSERT_DOUBLE_EQ(-0.5, b(1, 1));
495 }
496
497
498 TEST(Matrix, Inverse3)
499 {
500 OrthancStone::Matrix a, b;
501 a.resize(3, 3);
502 a(0, 0) = 7;
503 a(0, 1) = 2;
504 a(0, 2) = 1;
505 a(1, 0) = 0;
506 a(1, 1) = 3;
507 a(1, 2) = -1;
508 a(2, 0) = -3;
509 a(2, 1) = 4;
510 a(2, 2) = -2;
511
512 ASSERT_DOUBLE_EQ(1, OrthancStone::LinearAlgebra::ComputeDeterminant(a));
513 OrthancStone::LinearAlgebra::InvertMatrix(b, a);
514 ASSERT_EQ(3u, b.size1());
515 ASSERT_EQ(3u, b.size2());
516
517 ASSERT_DOUBLE_EQ(-2, b(0, 0));
518 ASSERT_DOUBLE_EQ(8, b(0, 1));
519 ASSERT_DOUBLE_EQ(-5, b(0, 2));
520 ASSERT_DOUBLE_EQ(3, b(1, 0));
521 ASSERT_DOUBLE_EQ(-11, b(1, 1));
522 ASSERT_DOUBLE_EQ(7, b(1, 2));
523 ASSERT_DOUBLE_EQ(9, b(2, 0));
524 ASSERT_DOUBLE_EQ(-34, b(2, 1));
525 ASSERT_DOUBLE_EQ(21, b(2, 2));
526
527
528 a(0, 0) = 1;
529 a(0, 1) = 2;
530 a(0, 2) = 2;
531 a(1, 0) = 1;
532 a(1, 1) = 0;
533 a(1, 2) = 1;
534 a(2, 0) = 1;
535 a(2, 1) = 2;
536 a(2, 2) = 1;
537
538 ASSERT_DOUBLE_EQ(2, OrthancStone::LinearAlgebra::ComputeDeterminant(a));
539 OrthancStone::LinearAlgebra::InvertMatrix(b, a);
540 ASSERT_EQ(3u, b.size1());
541 ASSERT_EQ(3u, b.size2());
542
543 ASSERT_DOUBLE_EQ(-1, b(0, 0));
544 ASSERT_DOUBLE_EQ(1, b(0, 1));
545 ASSERT_DOUBLE_EQ(1, b(0, 2));
546 ASSERT_DOUBLE_EQ(0, b(1, 0));
547 ASSERT_DOUBLE_EQ(-0.5, b(1, 1));
548 ASSERT_DOUBLE_EQ(0.5, b(1, 2));
549 ASSERT_DOUBLE_EQ(1, b(2, 0));
550 ASSERT_DOUBLE_EQ(0, b(2, 1));
551 ASSERT_DOUBLE_EQ(-1, b(2, 2));
552 }
553
554
440 int main(int argc, char **argv) 555 int main(int argc, char **argv)
441 { 556 {
442 Orthanc::Logging::Initialize(); 557 Orthanc::Logging::Initialize();
443 Orthanc::Logging::EnableInfoLevel(true); 558 Orthanc::Logging::EnableInfoLevel(true);
444 559