From 286a620021fbba518e9085dfb6f92cf70a2d7faa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20W=C3=A4ckerlin?= Date: Thu, 25 Aug 2016 19:53:49 +0000 Subject: [PATCH] documentation updated --- configure.ac | 4 +- debian/control.in | 2 +- src/matrix.hxx | 129 ++++--- test/basic.cxx | 858 ---------------------------------------------- test/makefile.am | 4 +- test/matricxx.cxx | 845 ++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 926 insertions(+), 916 deletions(-) delete mode 100644 test/basic.cxx diff --git a/configure.ac b/configure.ac index 6ed4f19..5c67173 100644 --- a/configure.ac +++ b/configure.ac @@ -10,8 +10,8 @@ m4_define(x_package_name, libmatricxx) # project's name m4_define(x_major, 1) # project's major version -m4_define(x_minor, 0) # project's minor version -m4_define(x_least_diff, 12) # start at 0 +m4_define(x_minor, 2) # project's minor version +m4_define(x_least_diff, 16) # start at 0 m4_include(ax_init_standard_project.m4) AC_INIT(x_package_name, x_version, x_bugreport, x_package_name) AM_INIT_AUTOMAKE([1.9 tar-pax parallel-tests color-tests]) diff --git a/debian/control.in b/debian/control.in index d8d0ba2..55c937f 100644 --- a/debian/control.in +++ b/debian/control.in @@ -1,7 +1,7 @@ Source: @PACKAGE_NAME@ Priority: extra Maintainer: @AUTHOR@ -Build-Depends: debhelper, subversion, pkg-config, automake, libtool, autotools-dev, lsb-release , doxygen, graphviz, mscgen, libcppunit-dev, g++ +Build-Depends: debhelper, subversion, pkg-config, automake, libtool, autotools-dev, lsb-release , doxygen, graphviz, mscgen, libcppunit-dev, g++, pandoc Package: @PACKAGE_NAME@ Section: libs diff --git a/src/matrix.hxx b/src/matrix.hxx index 5c7073e..a12c049 100644 --- a/src/matrix.hxx +++ b/src/matrix.hxx @@ -22,35 +22,50 @@ */ -/// Mathematical Classes and Functions -/** */ +/// Auxiliary Mathematical Functions namespace math { - template - bool almostEqual(TYPE a, TYPE b) { - a = std::fabs(a); - b = std::fabs(b); - TYPE diff(std::fabs(a-b)); - TYPE max(a>b?a:b); - if (max<1) return diff<=1000*std::numeric_limits::epsilon(); - return diff<=max*1000*std::numeric_limits::epsilon(); - } - + /// Compare Floating Points Whether They Are Almost Equal + /** Floating points such as @c float and @c double are not 100% + exact, because the numbers are represented by a limited number + of bits. That's why floating points should not be compared + with normal equality operator @c ==, but use function + math::equal. This function detects floating points and then + calls almostEqual instead of @c ==. */ + template + bool almostEqual(TYPE a, TYPE b) { + a = std::fabs(a); + b = std::fabs(b); + TYPE diff(std::fabs(a-b)); + TYPE max(a>b?a:b); + if (max<1) return diff<=1000*std::numeric_limits::epsilon(); + return diff<=max*1000*std::numeric_limits::epsilon(); + } + + /// Check Two Values For Equality + /** If the values are floating point variables, it calls + math::aux::almostEqual. */ template bool equal(const TYPE& a, const TYPE& b) { return a==b; } + /// Check if Two long double Values are Nearly Equal + /** calls math::aux::almostEqual. */ template<> bool equal(const long double& a, const long double& b) { return almostEqual(a, b); } - + + /// Check if Two @c double Values are Nearly Equal + /** calls math::aux::almostEqual. */ template<> bool equal(const double& a, const double& b) { return almostEqual(a, b); } - + + /// Check if Two @c float Values are Nearly Equal + /** calls math::aux::almostEqual. */ template<> bool equal(const float& a, const float& b) { return almostEqual(a, b); @@ -58,6 +73,8 @@ namespace math { } +/** Base class with common functions for Matrix and + Matrix. Implements generic common methods. */ template class MatrixBase { //..............................................................variables @@ -72,7 +89,7 @@ template class MatrixBase { public: /// @name Auxiliary Classes - ///{ + ///@{ /// Return One Row as Vector, internally used for element access /** Only used to access values: @@ -83,6 +100,7 @@ template class MatrixBase { @endcode */ class RowVector { public: + /// Get Column given a Matrix Row TYPE& operator[](size_t column) { assert(column<_m.COLUMNS); return _v[column]; @@ -98,6 +116,7 @@ template class MatrixBase { /// Same as RowVector, but in a constant environment. class ConstRowVector { public: + /// Get Column given a Matrix Row const TYPE& operator[](size_t column) const { assert(column<_m.COLUMNS); return _v[column]; @@ -110,13 +129,13 @@ template class MatrixBase { const TYPE *_v; }; - ///} + ///@} //................................................................methods public: /// @name construction - ///{ + ///@{ MatrixBase(size_t rows, size_t columns): ROWS(rows), COLUMNS(columns), @@ -130,60 +149,84 @@ template class MatrixBase { _c{std::forward(t)...} { } - ///} + ///@} /// @name element access - ///{ + ///@{ + /// Access Matrix Element at Given Row and Column + /** You have three possibilities to access an element of a + matrix: + + @code + Matrix m; + int a21 = m[2][1]; // use bracket operator + int b21 = m(2, 1); // use function operator + int c21 = m.at(2, 1); // use at + @endcode */ TYPE& at(size_t row, size_t column) { assert(row class MatrixBase { return true; } + /// Compare To Other Matrix bool operator!=(const MatrixBase& o) const { return !operator==(o); } + /// Add Other Matrix MatrixBase& operator+=(const MatrixBase& o) { assert_check(o); TYPE *to((TYPE*)(_c)+SIZE), *from((TYPE*)(o._c)+SIZE); @@ -202,6 +247,7 @@ template class MatrixBase { return *this; } + /// Subtract Other Matrix MatrixBase& operator-=(const MatrixBase& o) { assert_check(o); TYPE *to((TYPE*)(_c)+SIZE), *from((TYPE*)(o._c)+SIZE); @@ -209,35 +255,42 @@ template class MatrixBase { return *this; } + /// Multiply Matrix With Scalar MatrixBase& operator*=(const TYPE& o) { TYPE *res((TYPE*)(_c)+SIZE); while (res>(TYPE*)(_c)) *--res *= o; return *this; } + /// Divide Matrix By Scalar MatrixBase& operator/=(const TYPE& o) { TYPE *res((TYPE*)(_c)+SIZE); while (res>(TYPE*)(_c)) *--res /= o; return *this; } - ///} + ///@} /// @name special operations - ///{ + ///@{ + /// Apply Any External Function To Each Element MatrixBase& apply(std::function fn) { TYPE *to((TYPE*)(_c)+SIZE); while (to>(TYPE*)(_c)) fn(*--to); return *this; } + /// Calculate Determinant Of The Matrix + /** The Matrix is replaced by it's gaussian representation. */ TYPE det() { TYPE res(gauss()); for (TYPE *p((TYPE*)(_c)+SIZE); --p>=(TYPE*)(_c); p-=COLUMNS) res *= *p; return res; } + /// Calculate Gaussian Representation + /** The Matrix is replaced by it's gaussian representation. */ TYPE gauss() { /// calculate using gauss algorithmus /// @see http://www.mathebibel.de/determinante-berechnen-nach-gauss @@ -263,8 +316,6 @@ template class MatrixBase { return lambda; } - ///} - //................................................................methods protected: @@ -294,7 +345,7 @@ template class Matrix: public: /// @name construction - ///{ + ///@{ Matrix(): Parent(TROWS, TCOLUMNS) { memset(Parent::_c, 0, Parent::MEM_SIZE); @@ -309,10 +360,10 @@ template class Matrix: static_assert(sizeof...(t)==TROWS*TCOLUMNS, "wrong array size"); } - ///} + ///@} /// @name operators - ///{ + ///@{ Matrix& operator=(const Matrix& o) { Parent::operator=(o); @@ -356,10 +407,10 @@ template class Matrix: return res; } - ///} + ///@} /// @name special operations - ///{ + ///@{ Matrix& apply(std::function fn) { Parent::apply(fn); @@ -428,7 +479,7 @@ template class Matrix: return *this; } - ///} + ///@} }; //============================================================================== @@ -444,7 +495,7 @@ template class Matrix: public MatrixBase { public: /// @name construction - ///{ + ///@{ Matrix() = delete; @@ -467,19 +518,19 @@ template class Matrix: public MatrixBase { copy_args(Parent::_c, t...); } - ///} + ///@} /// @name destruction - ///{ + ///@{ virtual ~Matrix() { delete[] Parent::_c; } - ///} + ///@} /// @name operators - ///{ + ///@{ Matrix& operator=(const Matrix& o) { Parent::operator=(o); @@ -522,10 +573,10 @@ template class Matrix: public MatrixBase { return res; } - ///} + ///@} ///@name special operations - ///{ + ///@{ Matrix& resize(size_t rows, size_t columns) { if (rows!=this->ROWS||columns!=this->COLUMNS) { @@ -608,7 +659,7 @@ template class Matrix: public MatrixBase { return *this; } - ///} + ///@} //................................................................methods protected: diff --git a/test/basic.cxx b/test/basic.cxx deleted file mode 100644 index a6233a6..0000000 --- a/test/basic.cxx +++ /dev/null @@ -1,858 +0,0 @@ -/*! @file - - @id $Id$ -*/ -// 1 2 3 4 5 6 7 8 -// 45678901234567890123456789012345678901234567890123456789012345678901234567890 - -#include -#include -#include -#include -#include -#include -#include - -class TemplateMatrixTest: public CppUnit::TestFixture { - public: - template - void initFromArray1() { - const Matrix m {1, 2, 3, 4, - 5, 6, 7, 8}; - Matrix m2; - m2 = {1, 2, 3, 4, - 5, 6, 7, 8}; - CPPUNIT_ASSERT_EQUAL(m, m2); - CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); - CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); - CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); - CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); - CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); - CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); - CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); - CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); - } - template - void initFromArray2() { - const Matrix m(1, 2, 3, 4, - 5, 6, 7, 8); - CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); - CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); - CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); - CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); - CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); - CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); - CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); - CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); - } - template - void initFromArray3() { - const Matrix m({1, 2, 3, 4, - 5, 6, 7, 8}); - CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); - CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); - CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); - CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); - CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); - CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); - CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); - CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); - } - template - void initFromOtherMatrix() { - Matrix m1(1, 2, 3, 4, - 5, 6, 7, 8); - m1[1][2] = 13; - Matrix m2(m1); - m1[0][2] = 16; - m2[0][0] = 0; - Matrix m3; - m3 = m2; - CPPUNIT_ASSERT_EQUAL(m2, m3); - CPPUNIT_ASSERT_EQUAL((T)1, m1[0][0]); - CPPUNIT_ASSERT_EQUAL((T)2, m1[0][1]); - CPPUNIT_ASSERT_EQUAL((T)16, m1[0][2]); - CPPUNIT_ASSERT_EQUAL((T)4, m1[0][3]); - CPPUNIT_ASSERT_EQUAL((T)5, m1[1][0]); - CPPUNIT_ASSERT_EQUAL((T)6, m1[1][1]); - CPPUNIT_ASSERT_EQUAL((T)13, m1[1][2]); - CPPUNIT_ASSERT_EQUAL((T)8, m1[1][3]); - CPPUNIT_ASSERT_EQUAL((T)0, m2[0][0]); - CPPUNIT_ASSERT_EQUAL((T)2, m2[0][1]); - CPPUNIT_ASSERT_EQUAL((T)3, m2[0][2]); - CPPUNIT_ASSERT_EQUAL((T)4, m2[0][3]); - CPPUNIT_ASSERT_EQUAL((T)5, m2[1][0]); - CPPUNIT_ASSERT_EQUAL((T)6, m2[1][1]); - CPPUNIT_ASSERT_EQUAL((T)13, m2[1][2]); - CPPUNIT_ASSERT_EQUAL((T)8, m2[1][3]); - } - template - void initFromDefault() { - const Matrix m; - CPPUNIT_ASSERT_EQUAL((T)0, m[0][0]); - CPPUNIT_ASSERT_EQUAL((T)0, m[0][1]); - CPPUNIT_ASSERT_EQUAL((T)0, m[1][0]); - CPPUNIT_ASSERT_EQUAL((T)0, m[1][1]); - } - template - void access() { - Matrix m1(1, 2, 3, 4, - 5, 6, 7, 8); - for (size_t row(0); row<2; ++row) - for (size_t column(0); column<4; ++column) - CPPUNIT_ASSERT_EQUAL(m1(row, column), m1[row][column]); - } - template - void equality() { - Matrix m1(1, 2, 3, 4, - 5, 6, 7, 8); - Matrix m2(1, 2, 3, 4, - 5, 6, 7, 8); - Matrix m3(1, 2, 3, 4, - 5, 6, 7, 9); - Matrix m4(9, 2, 3, 4, - 5, 6, 7, 8); - Matrix m5(1, 2, 0, 4, - 5, 6, 7, 8); - CPPUNIT_ASSERT(m1==m2); - CPPUNIT_ASSERT(m1!=m3); - CPPUNIT_ASSERT(m1!=m4); - CPPUNIT_ASSERT(m1!=m5); - } - template - void operator_plus() { - const Matrix m1(1, 2, 3, 4, - 5, 6, 7, 8); - const Matrix m2(2, 4, 6, 8, - 1, 3, 5, 7); - const Matrix m(m1+m2); - const Matrix res(3, 6, 9, 12, - 6, 9, 12, 15); - CPPUNIT_ASSERT_EQUAL(res, m); - } - template - void operator_minus() { - const Matrix m1(1, 2, 3, 4, - 5, 6, 7, 8); - const Matrix m2(2, 4, 6, 8, - 1, 3, 5, 7); - const Matrix m(m1-m2); - const Matrix res(-1, -2, -3, -4, - 4, 3, 2, 1); - CPPUNIT_ASSERT_EQUAL(res, m); - CPPUNIT_ASSERT_EQUAL(res, -m2+m1); - } - template - void scalar_mult() { - const Matrix m1(1, 2, 3, 4, - 5, 6, 7, 8); - T two(2), three(3), four(4), big(32); - CPPUNIT_ASSERT_EQUAL(m1*two, m1+m1); - CPPUNIT_ASSERT_EQUAL(m1*three, m1+m1+m1); - CPPUNIT_ASSERT_EQUAL(m1*four, m1+m1+m1+m1); - CPPUNIT_ASSERT_EQUAL(two*m1, m1*two); - CPPUNIT_ASSERT_EQUAL(three*m1, m1*three); - CPPUNIT_ASSERT_EQUAL(four*m1, m1*four); - CPPUNIT_ASSERT_EQUAL(two*m1*two, m1*four); - CPPUNIT_ASSERT_EQUAL(big*m1*four, m1*four*big); - } - template - void scalar_div() { - const Matrix m1(2, 4, 6, 8, - 10, 12, 14, 16); - const Matrix m2(1, 2, 3, 4, - 5, 6, 7, 8); - CPPUNIT_ASSERT_EQUAL(m2, m1/(T)2); - CPPUNIT_ASSERT_EQUAL(m2, (T)3*m1/(T)6); - } - template - void matrix_mult() { - const Matrix m1(1, 2, 3, - 4, 5, 6); - const Matrix m2(1, 4, 7, 10, - 2, 5, 8, 11, - 3, 6, 9, 12); - const Matrix m(m1*m2); - const Matrix res(14, 32, 50, 68, - 32, 77, 122, 167); - CPPUNIT_ASSERT_EQUAL(res, m); - } - template - void transpose() { - const Matrix m(1, 2, 3, - 4, 5, 6); - const Matrix res(1, 4, - 2, 5, - 3, 6); - CPPUNIT_ASSERT_EQUAL(res, m.t()); - } - template - void apply() { - Matrix m(2, -2, 4, - -2, 1, -6, - 1, 0, -2); - Matrix o(m); - CPPUNIT_ASSERT_EQUAL((T)3*o, m.apply([](T& t){t*=3;})); - } - template - void gauss() { - Matrix m(2, -2, 4, - -2, 1, -6, - 1, 0, -2); - const Matrix res(1, -1, 2, - 0, -1, -2, - 0, 0, -6); - T lambda(m.gauss()); - CPPUNIT_ASSERT_EQUAL(res, m); - CPPUNIT_ASSERT_EQUAL((T)2, lambda); - } - template - void det() { - Matrix m(2, -2, 4, - -2, 1, -6, - 1, 0, -2); - CPPUNIT_ASSERT_EQUAL((T)12, m.det()); - } - template - void i() { - const Matrix m1(1, 0, 0, - 0, 1, 0, - 0, 0, 1); - const Matrix m2(1, 0, - 0, 1, - 0, 0); - const Matrix m3(1, 0, 0, - 0, 1, 0); - CPPUNIT_ASSERT_EQUAL(m1, m1.i()); - CPPUNIT_ASSERT_EQUAL(m2, m2.i()); - CPPUNIT_ASSERT_EQUAL(m3, m3.i()); - } - template - void inv() { - { - Matrix m(2, -1, 0, - 1, 2, -2, - 0, -1, 1); - const Matrix res(0, 1, 2, - -1, 2, 4, - -1, 2, 5); - Matrix o1(m), o2(m); - m.inv(); - CPPUNIT_ASSERT_EQUAL((T)2*res, (T)2/o1); - CPPUNIT_ASSERT_EQUAL(o1.i(), o1/o2); - CPPUNIT_ASSERT_EQUAL(res, m); - - } { - Matrix m(1, 2, 3, - 0, 1, 4, - 5, 6, 0); - const Matrix res(-24, 18, 5, - 20, -15, -4, - -5, 4, 1); - m.inv(); - CPPUNIT_ASSERT_EQUAL(res, m); - } { - Matrix m(1, 2, 3, - 0, 4, 5, - 1, 0, 6); - const Matrix res((T)12/11, (T)-6/11, (T)-1/11, - (T)5/22, (T)3/22, (T)-5/22, - (T)-2/11, (T)1/11, (T)2/11); - Matrix o1(m), o2(m); - m.inv(); - CPPUNIT_ASSERT_EQUAL((T)2*res, (T)2/o1); - CPPUNIT_ASSERT_EQUAL(o1.i(), o1/o2); - CPPUNIT_ASSERT_EQUAL(res, m); - } { - Matrix m(-2, 0, 1, - 9, 2, -3, - 5, 1, -2); - const Matrix res(-1, 1, -2, - 3, -1, 3, - -1, 2, -4); - Matrix o(m); - m.inv(); - CPPUNIT_ASSERT_EQUAL(m.i(), m*o); - CPPUNIT_ASSERT_EQUAL(res, m); - } { - Matrix m(1, 3, 1, - 1, 1, 2, - 2, 3, 4); - const Matrix res(2, 9, -5, - 0, -2, 1, - -1, -3, 2); - Matrix o(m); - m.inv(); - CPPUNIT_ASSERT_EQUAL(m.i(), m*o); - CPPUNIT_ASSERT_EQUAL(res, m); - } { - Matrix m(2, 1, 4, 1, - -1, 1, 0, 2, - 0, 0, 2, 4, - 2, -2, 0, 1); - const Matrix res((T)-1/3, (T)13/15, (T)-2/3, 0.6, - (T)1/3, (T)16/15, (T)-2/3, 0.2, - 0, -0.8, 0.5, -0.4, - 0, 0.4, 0, 0.2); - Matrix o(m); - m.inv(); - CPPUNIT_ASSERT_EQUAL(m.i(), m*o); - CPPUNIT_ASSERT_EQUAL(res, m); - } { - Matrix m(4, 3, - 3, 2); - const Matrix res(-2, 3, - 3, -4); - m.inv(); - CPPUNIT_ASSERT_EQUAL(res, m); - } - } - template - void stream() { - const Matrix m1(1, 2, 3, 4, - 5, 6, 7, 8, - 1, 4, 2, 8); - Matrix m2; - std::string res("[3x4]{1,2,3,4,5,6,7,8,1,4,2,8}"); - std::stringstream ss; - ss<>m2; - CPPUNIT_ASSERT_EQUAL(m1, m2); - } - CPPUNIT_TEST_SUITE(TemplateMatrixTest); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromArray3); - CPPUNIT_TEST(initFromArray3); - CPPUNIT_TEST(initFromArray3); - CPPUNIT_TEST(initFromArray3); - CPPUNIT_TEST(initFromArray3); - CPPUNIT_TEST(initFromArray3); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(access); - CPPUNIT_TEST(access); - CPPUNIT_TEST(access); - CPPUNIT_TEST(access); - CPPUNIT_TEST(access); - CPPUNIT_TEST(access); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(gauss); - CPPUNIT_TEST(gauss); - CPPUNIT_TEST(gauss); - CPPUNIT_TEST(gauss); - CPPUNIT_TEST(det); - CPPUNIT_TEST(det); - CPPUNIT_TEST(det); - CPPUNIT_TEST(det); - CPPUNIT_TEST(i); - CPPUNIT_TEST(i); - CPPUNIT_TEST(i); - CPPUNIT_TEST(i); - CPPUNIT_TEST(i); - CPPUNIT_TEST(i); - CPPUNIT_TEST(inv); - CPPUNIT_TEST(inv); - CPPUNIT_TEST(inv); - CPPUNIT_TEST(stream); - CPPUNIT_TEST(stream); - CPPUNIT_TEST(stream); - CPPUNIT_TEST(stream); - CPPUNIT_TEST(stream); - CPPUNIT_TEST(stream); - CPPUNIT_TEST_SUITE_END(); -}; -CPPUNIT_TEST_SUITE_REGISTRATION(TemplateMatrixTest); - -class VariableMatrixTest: public CppUnit::TestFixture { - public: - template - void initFromArray1() { - Matrix m(2,4, - 1, 2, 3, 4, - 5, 6, 7, 8); - Matrix m2(2, 4); - m2 = {2, 4, - 1, 2, 3, 4, - 5, 6, 7, 8}; - CPPUNIT_ASSERT_EQUAL(m, m2); - CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); - CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); - CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); - CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); - CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); - CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); - CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); - CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); - } - template - void initFromArray2() { - Matrix m(2, 4, - 1, 2, 3, 4, - 5, 6, 7, 8); - CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); - CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); - CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); - CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); - CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); - CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); - CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); - CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); - } - template - void initFromOtherMatrix() { - Matrix m1(2, 4, - 1, 2, 3, 4, - 5, 6, 7, 8); - m1[1][2] = 13; - Matrix m2(m1); - m1[0][2] = 16; - m2[0][0] = 0; - Matrix m3(2, 4); - m3 = m2; - CPPUNIT_ASSERT_EQUAL(m2, m3); - CPPUNIT_ASSERT_EQUAL((T)1, m1[0][0]); - CPPUNIT_ASSERT_EQUAL((T)2, m1[0][1]); - CPPUNIT_ASSERT_EQUAL((T)16, m1[0][2]); - CPPUNIT_ASSERT_EQUAL((T)4, m1[0][3]); - CPPUNIT_ASSERT_EQUAL((T)5, m1[1][0]); - CPPUNIT_ASSERT_EQUAL((T)6, m1[1][1]); - CPPUNIT_ASSERT_EQUAL((T)13, m1[1][2]); - CPPUNIT_ASSERT_EQUAL((T)8, m1[1][3]); - CPPUNIT_ASSERT_EQUAL((T)0, m2[0][0]); - CPPUNIT_ASSERT_EQUAL((T)2, m2[0][1]); - CPPUNIT_ASSERT_EQUAL((T)3, m2[0][2]); - CPPUNIT_ASSERT_EQUAL((T)4, m2[0][3]); - CPPUNIT_ASSERT_EQUAL((T)5, m2[1][0]); - CPPUNIT_ASSERT_EQUAL((T)6, m2[1][1]); - CPPUNIT_ASSERT_EQUAL((T)13, m2[1][2]); - CPPUNIT_ASSERT_EQUAL((T)8, m2[1][3]); - } - template - void initFromDefault() { - Matrix m(2, 4); - CPPUNIT_ASSERT_EQUAL((T)0, m[0][0]); - CPPUNIT_ASSERT_EQUAL((T)0, m[0][1]); - CPPUNIT_ASSERT_EQUAL((T)0, m[1][0]); - CPPUNIT_ASSERT_EQUAL((T)0, m[1][1]); - } - template - void access() { - Matrix m1(2, 4, - 1, 2, 3, 4, - 5, 6, 7, 8); - for (size_t row(0); row<2; ++row) - for (size_t column(0); column<4; ++column) - CPPUNIT_ASSERT_EQUAL(m1(row, column), m1[row][column]); - } - template - void equality() { - Matrix m1(2, 4, - 1, 2, 3, 4, - 5, 6, 7, 8); - Matrix m2(2, 4, - 1, 2, 3, 4, - 5, 6, 7, 8); - Matrix m3(2, 4, - 1, 2, 3, 4, - 5, 6, 7, 9); - Matrix m4(2, 4, - 9, 2, 3, 4, - 5, 6, 7, 8); - CPPUNIT_ASSERT(m1==m2); - CPPUNIT_ASSERT(m1!=m3); - CPPUNIT_ASSERT(m1!=m4); - } - template - void operator_plus() { - const Matrix m1(2, 4, - 1, 2, 3, 4, - 5, 6, 7, 8); - const Matrix m2(2, 4, - 2, 4, 6, 8, - 1, 3, 5, 7); - const Matrix m(m1+m2); - const Matrix res(2, 4, - 3, 6, 9, 12, - 6, 9, 12, 15); - CPPUNIT_ASSERT_EQUAL(res, m); - } - template - void operator_minus() { - const Matrix m1(2, 4, - 1, 2, 3, 4, - 5, 6, 7, 8); - const Matrix m2(2, 4, - 2, 4, 6, 8, - 1, 3, 5, 7); - const Matrix m(m1-m2); - const Matrix res(2, 4, - -1, -2, -3, -4, - 4, 3, 2, 1); - CPPUNIT_ASSERT_EQUAL(res, m); - CPPUNIT_ASSERT_EQUAL(res, -m2+m1); - } - template - void scalar_mult() { - const Matrix m1(2, 4, - 1, 2, 3, 4, - 5, 6, 7, 8); - T two(2), three(3), four(4), big(32); - CPPUNIT_ASSERT_EQUAL(m1*two, m1+m1); - CPPUNIT_ASSERT_EQUAL(m1*three, m1+m1+m1); - CPPUNIT_ASSERT_EQUAL(m1*four, m1+m1+m1+m1); - CPPUNIT_ASSERT_EQUAL(two*m1, m1*two); - CPPUNIT_ASSERT_EQUAL(three*m1, m1*three); - CPPUNIT_ASSERT_EQUAL(four*m1, m1*four); - CPPUNIT_ASSERT_EQUAL(two*m1*two, m1*four); - CPPUNIT_ASSERT_EQUAL(big*m1*four, m1*four*big); - } - template - void scalar_div() { - const Matrix m1(2, 4, - 2, 4, 6, 8, - 10, 12, 14, 16); - const Matrix m2(2, 4, - 1, 2, 3, 4, - 5, 6, 7, 8); - CPPUNIT_ASSERT_EQUAL(m2, m1/(T)2); - CPPUNIT_ASSERT_EQUAL(m2, (T)3*m1/(T)6); - } - template - void matrix_mult() { - const Matrix m1(2, 3, - 1, 2, 3, - 4, 5, 6); - const Matrix m2(3, 4, - 1, 4, 7, 10, - 2, 5, 8, 11, - 3, 6, 9, 12); - const Matrix m(m1*m2); - const Matrix res(2, 4, - 14, 32, 50, 68, - 32, 77, 122, 167); - CPPUNIT_ASSERT_EQUAL(res, m); - } - template - void transpose() { - const Matrix m(2, 3, - 1, 2, 3, - 4, 5, 6); - const Matrix res(3, 2, - 1, 4, - 2, 5, - 3, 6); - CPPUNIT_ASSERT_EQUAL(res, m.t()); - } - template - void apply() { - Matrix m(3, 3, - 2, -2, 4, - -2, 1, -6, - 1, 0, -2); - Matrix o(m); - CPPUNIT_ASSERT_EQUAL((T)3*o, m.apply([](T& t){t*=3;})); - } - template - void gauss() { - Matrix m(3, 3, - 2, -2, 4, - -2, 1, -6, - 1, 0, -2); - const Matrix res(3,3, - 1, -1, 2, - 0, -1, -2, - 0, 0, -6); - T lambda(m.gauss()); - CPPUNIT_ASSERT_EQUAL(res, m); - CPPUNIT_ASSERT_EQUAL((T)2, lambda); - } - template - void det() { - Matrix m(3, 3, - 2, -2, 4, - -2, 1, -6, - 1, 0, -2); - CPPUNIT_ASSERT_EQUAL((T)12, m.det()); - } - template - void i() { - const Matrix m1(3, 3, - 1, 0, 0, - 0, 1, 0, - 0, 0, 1); - const Matrix m2(3, 2, - 1, 0, - 0, 1, - 0, 0); - const Matrix m3(2, 3, - 1, 0, 0, - 0, 1, 0); - CPPUNIT_ASSERT_EQUAL(m1, m1.i()); - CPPUNIT_ASSERT_EQUAL(m2, m2.i()); - CPPUNIT_ASSERT_EQUAL(m3, m3.i()); - } - template - void inv() { - { - Matrix m(3, 3, - 2, -1, 0, - 1, 2, -2, - 0, -1, 1); - const Matrix res(3, 3, - 0, 1, 2, - -1, 2, 4, - -1, 2, 5); - Matrix o1(m), o2(m); - m.inv(); - CPPUNIT_ASSERT_EQUAL((T)2*res, (T)2/o1); - CPPUNIT_ASSERT_EQUAL(o1.i(), o1/o2); - CPPUNIT_ASSERT_EQUAL(res, m); - } { - Matrix m(3, 3, - 1, 2, 3, - 0, 1, 4, - 5, 6, 0); - const Matrix res(3, 3, - -24, 18, 5, - 20, -15, -4, - -5, 4, 1); - m.inv(); - CPPUNIT_ASSERT_EQUAL(res, m); - } { - Matrix m(3, 3, - 1, 2, 3, - 0, 4, 5, - 1, 0, 6); - const Matrix res(3, 3, - (T)12/11, (T)-6/11, (T)-1/11, - (T)5/22, (T)3/22, (T)-5/22, - (T)-2/11, (T)1/11, (T)2/11); - m.inv(); - CPPUNIT_ASSERT_EQUAL(res, m); - } { - Matrix m(3, 3, - -2, 0, 1, - 9, 2, -3, - 5, 1, -2); - const Matrix res(3, 3, - -1, 1, -2, - 3, -1, 3, - -1, 2, -4); - Matrix o(m); - m.inv(); - CPPUNIT_ASSERT_EQUAL(m.i(), m*o); - CPPUNIT_ASSERT_EQUAL(res, m); - } { - Matrix m(4, 4, - 2, 1, 4, 1, - -1, 1, 0, 2, - 0, 0, 2, 4, - 2, -2, 0, 1); - const Matrix res(4, 4, - (T)-1/3, (T)13/15, (T)-2/3, 0.6, - (T)1/3, (T)16/15, (T)-2/3, 0.2, - 0, -0.8, 0.5, -0.4, - 0, 0.4, 0, 0.2); - Matrix o(m); - m.inv(); - CPPUNIT_ASSERT_EQUAL(m.i(), m*o); - CPPUNIT_ASSERT_EQUAL(res, m); - } { - Matrix m(2, 2, - 4, 3, - 3, 2); - const Matrix res(2, 2, - -2, 3, - 3, -4); - m.inv(); - CPPUNIT_ASSERT_EQUAL(res, m); - } - } - template - void stream() { - const Matrix m1(3, 4, - 1, 2, 3, 4, - 5, 6, 7, 8, - 1, 4, 2, 8); - Matrix m2(1, 1); - std::string res("[3x4]{1,2,3,4,5,6,7,8,1,4,2,8}"); - std::stringstream ss; - ss<>m2; - CPPUNIT_ASSERT_EQUAL(m1, m2); - } - CPPUNIT_TEST_SUITE(VariableMatrixTest); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray1); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromArray2); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(initFromOtherMatrix); - CPPUNIT_TEST(access); - CPPUNIT_TEST(access); - CPPUNIT_TEST(access); - CPPUNIT_TEST(access); - CPPUNIT_TEST(access); - CPPUNIT_TEST(access); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(equality); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_plus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(operator_minus); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_mult); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(scalar_div); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(matrix_mult); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(transpose); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(apply); - CPPUNIT_TEST(gauss); - CPPUNIT_TEST(gauss); - CPPUNIT_TEST(gauss); - CPPUNIT_TEST(gauss); - CPPUNIT_TEST(det); - CPPUNIT_TEST(det); - CPPUNIT_TEST(det); - CPPUNIT_TEST(det); - CPPUNIT_TEST(i); - CPPUNIT_TEST(i); - CPPUNIT_TEST(i); - CPPUNIT_TEST(i); - CPPUNIT_TEST(i); - CPPUNIT_TEST(i); - CPPUNIT_TEST(inv); - CPPUNIT_TEST(inv); - CPPUNIT_TEST(inv); - CPPUNIT_TEST(stream); - CPPUNIT_TEST(stream); - CPPUNIT_TEST(stream); - CPPUNIT_TEST(stream); - CPPUNIT_TEST(stream); - CPPUNIT_TEST(stream); - CPPUNIT_TEST_SUITE_END(); -}; -CPPUNIT_TEST_SUITE_REGISTRATION(VariableMatrixTest); - -int main(int argc, char** argv) try { - std::ofstream ofs((*argv+std::string(".xml")).c_str()); - CppUnit::TextUi::TestRunner runner; - runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), ofs)); - runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); - return runner.run() ? 0 : 1; - } catch (std::exception& e) { - std::cerr<<"***Exception: "< #include #include #include @@ -17,17 +13,838 @@ #include #include -/// @todo Rename DummyTest and DummyTest::dummy() -/// @todo Write test cases -class DummyTest: public CppUnit::TestFixture { +class TemplateMatrixTest: public CppUnit::TestFixture { public: - void dummy() { + template + void initFromArray1() { + const Matrix m {1, 2, 3, 4, + 5, 6, 7, 8}; + Matrix m2; + m2 = {1, 2, 3, 4, + 5, 6, 7, 8}; + CPPUNIT_ASSERT_EQUAL(m, m2); + CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); + CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); + CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); + CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); + CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); + CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); + CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); + CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); + } + template + void initFromArray2() { + const Matrix m(1, 2, 3, 4, + 5, 6, 7, 8); + CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); + CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); + CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); + CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); + CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); + CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); + CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); + CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); + } + template + void initFromArray3() { + const Matrix m({1, 2, 3, 4, + 5, 6, 7, 8}); + CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); + CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); + CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); + CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); + CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); + CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); + CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); + CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); + } + template + void initFromOtherMatrix() { + Matrix m1(1, 2, 3, 4, + 5, 6, 7, 8); + m1[1][2] = 13; + Matrix m2(m1); + m1[0][2] = 16; + m2[0][0] = 0; + Matrix m3; + m3 = m2; + CPPUNIT_ASSERT_EQUAL(m2, m3); + CPPUNIT_ASSERT_EQUAL((T)1, m1[0][0]); + CPPUNIT_ASSERT_EQUAL((T)2, m1[0][1]); + CPPUNIT_ASSERT_EQUAL((T)16, m1[0][2]); + CPPUNIT_ASSERT_EQUAL((T)4, m1[0][3]); + CPPUNIT_ASSERT_EQUAL((T)5, m1[1][0]); + CPPUNIT_ASSERT_EQUAL((T)6, m1[1][1]); + CPPUNIT_ASSERT_EQUAL((T)13, m1[1][2]); + CPPUNIT_ASSERT_EQUAL((T)8, m1[1][3]); + CPPUNIT_ASSERT_EQUAL((T)0, m2[0][0]); + CPPUNIT_ASSERT_EQUAL((T)2, m2[0][1]); + CPPUNIT_ASSERT_EQUAL((T)3, m2[0][2]); + CPPUNIT_ASSERT_EQUAL((T)4, m2[0][3]); + CPPUNIT_ASSERT_EQUAL((T)5, m2[1][0]); + CPPUNIT_ASSERT_EQUAL((T)6, m2[1][1]); + CPPUNIT_ASSERT_EQUAL((T)13, m2[1][2]); + CPPUNIT_ASSERT_EQUAL((T)8, m2[1][3]); + } + template + void initFromDefault() { + const Matrix m; + CPPUNIT_ASSERT_EQUAL((T)0, m[0][0]); + CPPUNIT_ASSERT_EQUAL((T)0, m[0][1]); + CPPUNIT_ASSERT_EQUAL((T)0, m[1][0]); + CPPUNIT_ASSERT_EQUAL((T)0, m[1][1]); + } + template + void access() { + Matrix m1(1, 2, 3, 4, + 5, 6, 7, 8); + for (size_t row(0); row<2; ++row) + for (size_t column(0); column<4; ++column) + CPPUNIT_ASSERT_EQUAL(m1(row, column), m1[row][column]); + } + template + void equality() { + Matrix m1(1, 2, 3, 4, + 5, 6, 7, 8); + Matrix m2(1, 2, 3, 4, + 5, 6, 7, 8); + Matrix m3(1, 2, 3, 4, + 5, 6, 7, 9); + Matrix m4(9, 2, 3, 4, + 5, 6, 7, 8); + Matrix m5(1, 2, 0, 4, + 5, 6, 7, 8); + CPPUNIT_ASSERT(m1==m2); + CPPUNIT_ASSERT(m1!=m3); + CPPUNIT_ASSERT(m1!=m4); + CPPUNIT_ASSERT(m1!=m5); + } + template + void operator_plus() { + const Matrix m1(1, 2, 3, 4, + 5, 6, 7, 8); + const Matrix m2(2, 4, 6, 8, + 1, 3, 5, 7); + const Matrix m(m1+m2); + const Matrix res(3, 6, 9, 12, + 6, 9, 12, 15); + CPPUNIT_ASSERT_EQUAL(res, m); + } + template + void operator_minus() { + const Matrix m1(1, 2, 3, 4, + 5, 6, 7, 8); + const Matrix m2(2, 4, 6, 8, + 1, 3, 5, 7); + const Matrix m(m1-m2); + const Matrix res(-1, -2, -3, -4, + 4, 3, 2, 1); + CPPUNIT_ASSERT_EQUAL(res, m); + CPPUNIT_ASSERT_EQUAL(res, -m2+m1); + } + template + void scalar_mult() { + const Matrix m1(1, 2, 3, 4, + 5, 6, 7, 8); + T two(2), three(3), four(4), big(32); + CPPUNIT_ASSERT_EQUAL(m1*two, m1+m1); + CPPUNIT_ASSERT_EQUAL(m1*three, m1+m1+m1); + CPPUNIT_ASSERT_EQUAL(m1*four, m1+m1+m1+m1); + CPPUNIT_ASSERT_EQUAL(two*m1, m1*two); + CPPUNIT_ASSERT_EQUAL(three*m1, m1*three); + CPPUNIT_ASSERT_EQUAL(four*m1, m1*four); + CPPUNIT_ASSERT_EQUAL(two*m1*two, m1*four); + CPPUNIT_ASSERT_EQUAL(big*m1*four, m1*four*big); + } + template + void scalar_div() { + const Matrix m1(2, 4, 6, 8, + 10, 12, 14, 16); + const Matrix m2(1, 2, 3, 4, + 5, 6, 7, 8); + CPPUNIT_ASSERT_EQUAL(m2, m1/(T)2); + CPPUNIT_ASSERT_EQUAL(m2, (T)3*m1/(T)6); + } + template + void matrix_mult() { + const Matrix m1(1, 2, 3, + 4, 5, 6); + const Matrix m2(1, 4, 7, 10, + 2, 5, 8, 11, + 3, 6, 9, 12); + const Matrix m(m1*m2); + const Matrix res(14, 32, 50, 68, + 32, 77, 122, 167); + CPPUNIT_ASSERT_EQUAL(res, m); + } + template + void transpose() { + const Matrix m(1, 2, 3, + 4, 5, 6); + const Matrix res(1, 4, + 2, 5, + 3, 6); + CPPUNIT_ASSERT_EQUAL(res, m.t()); + } + template + void apply() { + Matrix m(2, -2, 4, + -2, 1, -6, + 1, 0, -2); + Matrix o(m); + CPPUNIT_ASSERT_EQUAL((T)3*o, m.apply([](T& t){t*=3;})); + } + template + void gauss() { + Matrix m(2, -2, 4, + -2, 1, -6, + 1, 0, -2); + const Matrix res(1, -1, 2, + 0, -1, -2, + 0, 0, -6); + T lambda(m.gauss()); + CPPUNIT_ASSERT_EQUAL(res, m); + CPPUNIT_ASSERT_EQUAL((T)2, lambda); + } + template + void det() { + Matrix m(2, -2, 4, + -2, 1, -6, + 1, 0, -2); + CPPUNIT_ASSERT_EQUAL((T)12, m.det()); + } + template + void i() { + const Matrix m1(1, 0, 0, + 0, 1, 0, + 0, 0, 1); + const Matrix m2(1, 0, + 0, 1, + 0, 0); + const Matrix m3(1, 0, 0, + 0, 1, 0); + CPPUNIT_ASSERT_EQUAL(m1, m1.i()); + CPPUNIT_ASSERT_EQUAL(m2, m2.i()); + CPPUNIT_ASSERT_EQUAL(m3, m3.i()); + } + template + void inv() { + { + Matrix m(2, -1, 0, + 1, 2, -2, + 0, -1, 1); + const Matrix res(0, 1, 2, + -1, 2, 4, + -1, 2, 5); + Matrix o1(m), o2(m); + m.inv(); + CPPUNIT_ASSERT_EQUAL((T)2*res, (T)2/o1); + CPPUNIT_ASSERT_EQUAL(o1.i(), o1/o2); + CPPUNIT_ASSERT_EQUAL(res, m); + + } { + Matrix m(1, 2, 3, + 0, 1, 4, + 5, 6, 0); + const Matrix res(-24, 18, 5, + 20, -15, -4, + -5, 4, 1); + m.inv(); + CPPUNIT_ASSERT_EQUAL(res, m); + } { + Matrix m(1, 2, 3, + 0, 4, 5, + 1, 0, 6); + const Matrix res((T)12/11, (T)-6/11, (T)-1/11, + (T)5/22, (T)3/22, (T)-5/22, + (T)-2/11, (T)1/11, (T)2/11); + Matrix o1(m), o2(m); + m.inv(); + CPPUNIT_ASSERT_EQUAL((T)2*res, (T)2/o1); + CPPUNIT_ASSERT_EQUAL(o1.i(), o1/o2); + CPPUNIT_ASSERT_EQUAL(res, m); + } { + Matrix m(-2, 0, 1, + 9, 2, -3, + 5, 1, -2); + const Matrix res(-1, 1, -2, + 3, -1, 3, + -1, 2, -4); + Matrix o(m); + m.inv(); + CPPUNIT_ASSERT_EQUAL(m.i(), m*o); + CPPUNIT_ASSERT_EQUAL(res, m); + } { + Matrix m(1, 3, 1, + 1, 1, 2, + 2, 3, 4); + const Matrix res(2, 9, -5, + 0, -2, 1, + -1, -3, 2); + Matrix o(m); + m.inv(); + CPPUNIT_ASSERT_EQUAL(m.i(), m*o); + CPPUNIT_ASSERT_EQUAL(res, m); + } { + Matrix m(2, 1, 4, 1, + -1, 1, 0, 2, + 0, 0, 2, 4, + 2, -2, 0, 1); + const Matrix res((T)-1/3, (T)13/15, (T)-2/3, 0.6, + (T)1/3, (T)16/15, (T)-2/3, 0.2, + 0, -0.8, 0.5, -0.4, + 0, 0.4, 0, 0.2); + Matrix o(m); + m.inv(); + CPPUNIT_ASSERT_EQUAL(m.i(), m*o); + CPPUNIT_ASSERT_EQUAL(res, m); + } { + Matrix m(4, 3, + 3, 2); + const Matrix res(-2, 3, + 3, -4); + m.inv(); + CPPUNIT_ASSERT_EQUAL(res, m); + } + } + template + void stream() { + const Matrix m1(1, 2, 3, 4, + 5, 6, 7, 8, + 1, 4, 2, 8); + Matrix m2; + std::string res("[3x4]{1,2,3,4,5,6,7,8,1,4,2,8}"); + std::stringstream ss; + ss<>m2; + CPPUNIT_ASSERT_EQUAL(m1, m2); + } + CPPUNIT_TEST_SUITE(TemplateMatrixTest); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromArray3); + CPPUNIT_TEST(initFromArray3); + CPPUNIT_TEST(initFromArray3); + CPPUNIT_TEST(initFromArray3); + CPPUNIT_TEST(initFromArray3); + CPPUNIT_TEST(initFromArray3); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(access); + CPPUNIT_TEST(access); + CPPUNIT_TEST(access); + CPPUNIT_TEST(access); + CPPUNIT_TEST(access); + CPPUNIT_TEST(access); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(gauss); + CPPUNIT_TEST(gauss); + CPPUNIT_TEST(gauss); + CPPUNIT_TEST(gauss); + CPPUNIT_TEST(det); + CPPUNIT_TEST(det); + CPPUNIT_TEST(det); + CPPUNIT_TEST(det); + CPPUNIT_TEST(i); + CPPUNIT_TEST(i); + CPPUNIT_TEST(i); + CPPUNIT_TEST(i); + CPPUNIT_TEST(i); + CPPUNIT_TEST(i); + CPPUNIT_TEST(inv); + CPPUNIT_TEST(inv); + CPPUNIT_TEST(inv); + CPPUNIT_TEST(stream); + CPPUNIT_TEST(stream); + CPPUNIT_TEST(stream); + CPPUNIT_TEST(stream); + CPPUNIT_TEST(stream); + CPPUNIT_TEST(stream); + CPPUNIT_TEST_SUITE_END(); +}; +CPPUNIT_TEST_SUITE_REGISTRATION(TemplateMatrixTest); + +class VariableMatrixTest: public CppUnit::TestFixture { + public: + template + void initFromArray1() { + Matrix m(2,4, + 1, 2, 3, 4, + 5, 6, 7, 8); + Matrix m2(2, 4); + m2 = {2, 4, + 1, 2, 3, 4, + 5, 6, 7, 8}; + CPPUNIT_ASSERT_EQUAL(m, m2); + CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); + CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); + CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); + CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); + CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); + CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); + CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); + CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); + } + template + void initFromArray2() { + Matrix m(2, 4, + 1, 2, 3, 4, + 5, 6, 7, 8); + CPPUNIT_ASSERT_EQUAL((T)1, m[0][0]); + CPPUNIT_ASSERT_EQUAL((T)2, m[0][1]); + CPPUNIT_ASSERT_EQUAL((T)3, m[0][2]); + CPPUNIT_ASSERT_EQUAL((T)4, m[0][3]); + CPPUNIT_ASSERT_EQUAL((T)5, m[1][0]); + CPPUNIT_ASSERT_EQUAL((T)6, m[1][1]); + CPPUNIT_ASSERT_EQUAL((T)7, m[1][2]); + CPPUNIT_ASSERT_EQUAL((T)8, m[1][3]); + } + template + void initFromOtherMatrix() { + Matrix m1(2, 4, + 1, 2, 3, 4, + 5, 6, 7, 8); + m1[1][2] = 13; + Matrix m2(m1); + m1[0][2] = 16; + m2[0][0] = 0; + Matrix m3(2, 4); + m3 = m2; + CPPUNIT_ASSERT_EQUAL(m2, m3); + CPPUNIT_ASSERT_EQUAL((T)1, m1[0][0]); + CPPUNIT_ASSERT_EQUAL((T)2, m1[0][1]); + CPPUNIT_ASSERT_EQUAL((T)16, m1[0][2]); + CPPUNIT_ASSERT_EQUAL((T)4, m1[0][3]); + CPPUNIT_ASSERT_EQUAL((T)5, m1[1][0]); + CPPUNIT_ASSERT_EQUAL((T)6, m1[1][1]); + CPPUNIT_ASSERT_EQUAL((T)13, m1[1][2]); + CPPUNIT_ASSERT_EQUAL((T)8, m1[1][3]); + CPPUNIT_ASSERT_EQUAL((T)0, m2[0][0]); + CPPUNIT_ASSERT_EQUAL((T)2, m2[0][1]); + CPPUNIT_ASSERT_EQUAL((T)3, m2[0][2]); + CPPUNIT_ASSERT_EQUAL((T)4, m2[0][3]); + CPPUNIT_ASSERT_EQUAL((T)5, m2[1][0]); + CPPUNIT_ASSERT_EQUAL((T)6, m2[1][1]); + CPPUNIT_ASSERT_EQUAL((T)13, m2[1][2]); + CPPUNIT_ASSERT_EQUAL((T)8, m2[1][3]); + } + template + void initFromDefault() { + Matrix m(2, 4); + CPPUNIT_ASSERT_EQUAL((T)0, m[0][0]); + CPPUNIT_ASSERT_EQUAL((T)0, m[0][1]); + CPPUNIT_ASSERT_EQUAL((T)0, m[1][0]); + CPPUNIT_ASSERT_EQUAL((T)0, m[1][1]); + } + template + void access() { + Matrix m1(2, 4, + 1, 2, 3, 4, + 5, 6, 7, 8); + for (size_t row(0); row<2; ++row) + for (size_t column(0); column<4; ++column) + CPPUNIT_ASSERT_EQUAL(m1(row, column), m1[row][column]); + } + template + void equality() { + Matrix m1(2, 4, + 1, 2, 3, 4, + 5, 6, 7, 8); + Matrix m2(2, 4, + 1, 2, 3, 4, + 5, 6, 7, 8); + Matrix m3(2, 4, + 1, 2, 3, 4, + 5, 6, 7, 9); + Matrix m4(2, 4, + 9, 2, 3, 4, + 5, 6, 7, 8); + CPPUNIT_ASSERT(m1==m2); + CPPUNIT_ASSERT(m1!=m3); + CPPUNIT_ASSERT(m1!=m4); + } + template + void operator_plus() { + const Matrix m1(2, 4, + 1, 2, 3, 4, + 5, 6, 7, 8); + const Matrix m2(2, 4, + 2, 4, 6, 8, + 1, 3, 5, 7); + const Matrix m(m1+m2); + const Matrix res(2, 4, + 3, 6, 9, 12, + 6, 9, 12, 15); + CPPUNIT_ASSERT_EQUAL(res, m); + } + template + void operator_minus() { + const Matrix m1(2, 4, + 1, 2, 3, 4, + 5, 6, 7, 8); + const Matrix m2(2, 4, + 2, 4, 6, 8, + 1, 3, 5, 7); + const Matrix m(m1-m2); + const Matrix res(2, 4, + -1, -2, -3, -4, + 4, 3, 2, 1); + CPPUNIT_ASSERT_EQUAL(res, m); + CPPUNIT_ASSERT_EQUAL(res, -m2+m1); + } + template + void scalar_mult() { + const Matrix m1(2, 4, + 1, 2, 3, 4, + 5, 6, 7, 8); + T two(2), three(3), four(4), big(32); + CPPUNIT_ASSERT_EQUAL(m1*two, m1+m1); + CPPUNIT_ASSERT_EQUAL(m1*three, m1+m1+m1); + CPPUNIT_ASSERT_EQUAL(m1*four, m1+m1+m1+m1); + CPPUNIT_ASSERT_EQUAL(two*m1, m1*two); + CPPUNIT_ASSERT_EQUAL(three*m1, m1*three); + CPPUNIT_ASSERT_EQUAL(four*m1, m1*four); + CPPUNIT_ASSERT_EQUAL(two*m1*two, m1*four); + CPPUNIT_ASSERT_EQUAL(big*m1*four, m1*four*big); + } + template + void scalar_div() { + const Matrix m1(2, 4, + 2, 4, 6, 8, + 10, 12, 14, 16); + const Matrix m2(2, 4, + 1, 2, 3, 4, + 5, 6, 7, 8); + CPPUNIT_ASSERT_EQUAL(m2, m1/(T)2); + CPPUNIT_ASSERT_EQUAL(m2, (T)3*m1/(T)6); + } + template + void matrix_mult() { + const Matrix m1(2, 3, + 1, 2, 3, + 4, 5, 6); + const Matrix m2(3, 4, + 1, 4, 7, 10, + 2, 5, 8, 11, + 3, 6, 9, 12); + const Matrix m(m1*m2); + const Matrix res(2, 4, + 14, 32, 50, 68, + 32, 77, 122, 167); + CPPUNIT_ASSERT_EQUAL(res, m); + } + template + void transpose() { + const Matrix m(2, 3, + 1, 2, 3, + 4, 5, 6); + const Matrix res(3, 2, + 1, 4, + 2, 5, + 3, 6); + CPPUNIT_ASSERT_EQUAL(res, m.t()); + } + template + void apply() { + Matrix m(3, 3, + 2, -2, 4, + -2, 1, -6, + 1, 0, -2); + Matrix o(m); + CPPUNIT_ASSERT_EQUAL((T)3*o, m.apply([](T& t){t*=3;})); + } + template + void gauss() { + Matrix m(3, 3, + 2, -2, 4, + -2, 1, -6, + 1, 0, -2); + const Matrix res(3,3, + 1, -1, 2, + 0, -1, -2, + 0, 0, -6); + T lambda(m.gauss()); + CPPUNIT_ASSERT_EQUAL(res, m); + CPPUNIT_ASSERT_EQUAL((T)2, lambda); + } + template + void det() { + Matrix m(3, 3, + 2, -2, 4, + -2, 1, -6, + 1, 0, -2); + CPPUNIT_ASSERT_EQUAL((T)12, m.det()); + } + template + void i() { + const Matrix m1(3, 3, + 1, 0, 0, + 0, 1, 0, + 0, 0, 1); + const Matrix m2(3, 2, + 1, 0, + 0, 1, + 0, 0); + const Matrix m3(2, 3, + 1, 0, 0, + 0, 1, 0); + CPPUNIT_ASSERT_EQUAL(m1, m1.i()); + CPPUNIT_ASSERT_EQUAL(m2, m2.i()); + CPPUNIT_ASSERT_EQUAL(m3, m3.i()); + } + template + void inv() { + { + Matrix m(3, 3, + 2, -1, 0, + 1, 2, -2, + 0, -1, 1); + const Matrix res(3, 3, + 0, 1, 2, + -1, 2, 4, + -1, 2, 5); + Matrix o1(m), o2(m); + m.inv(); + CPPUNIT_ASSERT_EQUAL((T)2*res, (T)2/o1); + CPPUNIT_ASSERT_EQUAL(o1.i(), o1/o2); + CPPUNIT_ASSERT_EQUAL(res, m); + } { + Matrix m(3, 3, + 1, 2, 3, + 0, 1, 4, + 5, 6, 0); + const Matrix res(3, 3, + -24, 18, 5, + 20, -15, -4, + -5, 4, 1); + m.inv(); + CPPUNIT_ASSERT_EQUAL(res, m); + } { + Matrix m(3, 3, + 1, 2, 3, + 0, 4, 5, + 1, 0, 6); + const Matrix res(3, 3, + (T)12/11, (T)-6/11, (T)-1/11, + (T)5/22, (T)3/22, (T)-5/22, + (T)-2/11, (T)1/11, (T)2/11); + m.inv(); + CPPUNIT_ASSERT_EQUAL(res, m); + } { + Matrix m(3, 3, + -2, 0, 1, + 9, 2, -3, + 5, 1, -2); + const Matrix res(3, 3, + -1, 1, -2, + 3, -1, 3, + -1, 2, -4); + Matrix o(m); + m.inv(); + CPPUNIT_ASSERT_EQUAL(m.i(), m*o); + CPPUNIT_ASSERT_EQUAL(res, m); + } { + Matrix m(4, 4, + 2, 1, 4, 1, + -1, 1, 0, 2, + 0, 0, 2, 4, + 2, -2, 0, 1); + const Matrix res(4, 4, + (T)-1/3, (T)13/15, (T)-2/3, 0.6, + (T)1/3, (T)16/15, (T)-2/3, 0.2, + 0, -0.8, 0.5, -0.4, + 0, 0.4, 0, 0.2); + Matrix o(m); + m.inv(); + CPPUNIT_ASSERT_EQUAL(m.i(), m*o); + CPPUNIT_ASSERT_EQUAL(res, m); + } { + Matrix m(2, 2, + 4, 3, + 3, 2); + const Matrix res(2, 2, + -2, 3, + 3, -4); + m.inv(); + CPPUNIT_ASSERT_EQUAL(res, m); + } + } + template + void stream() { + const Matrix m1(3, 4, + 1, 2, 3, 4, + 5, 6, 7, 8, + 1, 4, 2, 8); + Matrix m2(1, 1); + std::string res("[3x4]{1,2,3,4,5,6,7,8,1,4,2,8}"); + std::stringstream ss; + ss<>m2; + CPPUNIT_ASSERT_EQUAL(m1, m2); } - CPPUNIT_TEST_SUITE(DummyTest); - CPPUNIT_TEST(dummy); + CPPUNIT_TEST_SUITE(VariableMatrixTest); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray1); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromArray2); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(initFromOtherMatrix); + CPPUNIT_TEST(access); + CPPUNIT_TEST(access); + CPPUNIT_TEST(access); + CPPUNIT_TEST(access); + CPPUNIT_TEST(access); + CPPUNIT_TEST(access); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(equality); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_plus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(operator_minus); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_mult); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(scalar_div); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(matrix_mult); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(transpose); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(apply); + CPPUNIT_TEST(gauss); + CPPUNIT_TEST(gauss); + CPPUNIT_TEST(gauss); + CPPUNIT_TEST(gauss); + CPPUNIT_TEST(det); + CPPUNIT_TEST(det); + CPPUNIT_TEST(det); + CPPUNIT_TEST(det); + CPPUNIT_TEST(i); + CPPUNIT_TEST(i); + CPPUNIT_TEST(i); + CPPUNIT_TEST(i); + CPPUNIT_TEST(i); + CPPUNIT_TEST(i); + CPPUNIT_TEST(inv); + CPPUNIT_TEST(inv); + CPPUNIT_TEST(inv); + CPPUNIT_TEST(stream); + CPPUNIT_TEST(stream); + CPPUNIT_TEST(stream); + CPPUNIT_TEST(stream); + CPPUNIT_TEST(stream); + CPPUNIT_TEST(stream); CPPUNIT_TEST_SUITE_END(); }; -CPPUNIT_TEST_SUITE_REGISTRATION(DummyTest); +CPPUNIT_TEST_SUITE_REGISTRATION(VariableMatrixTest); int main(int argc, char** argv) try { std::ofstream ofs((*argv+std::string(".xml")).c_str());