aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/triangular.cpp
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2008-05-02 11:35:59 +0000
committerGravatar Gael Guennebaud <g.gael@free.fr>2008-05-02 11:35:59 +0000
commite19f9bc52308b067457c7e2db3eba208966b267f (patch)
treed723b7c309c6255820d31f0760bfdb8fffdbd54d /test/triangular.cpp
parent890a8de962e575442bc3195967a26a26e5139db9 (diff)
added a test for triangular matrices
Diffstat (limited to 'test/triangular.cpp')
-rw-r--r--test/triangular.cpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/test/triangular.cpp b/test/triangular.cpp
new file mode 100644
index 000000000..3b26e246f
--- /dev/null
+++ b/test/triangular.cpp
@@ -0,0 +1,100 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra. Eigen itself is part of the KDE project.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@gmail.com>
+//
+// Eigen is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 3 of the License, or (at your option) any later version.
+//
+// Alternatively, you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of
+// the License, or (at your option) any later version.
+//
+// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License and a copy of the GNU General Public License along with
+// Eigen. If not, see <http://www.gnu.org/licenses/>.
+
+#include "main.h"
+
+namespace Eigen {
+
+template<typename MatrixType> void triangular(const MatrixType& m)
+{
+ typedef typename MatrixType::Scalar Scalar;
+ typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> VectorType;
+
+ int rows = m.rows();
+ int cols = m.cols();
+
+ MatrixType m1 = MatrixType::random(rows, cols),
+ m2 = MatrixType::random(rows, cols),
+ m3(rows, cols),
+ r1(rows, cols),
+ r2(rows, cols),
+ mzero = MatrixType::zero(rows, cols),
+ mones = MatrixType::ones(rows, cols),
+ identity = Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime>
+ ::identity(rows, rows),
+ square = Matrix<Scalar, MatrixType::RowsAtCompileTime, MatrixType::RowsAtCompileTime>
+ ::random(rows, rows);
+ VectorType v1 = VectorType::random(rows),
+ v2 = VectorType::random(rows),
+ vzero = VectorType::zero(rows);
+
+ MatrixType m1up = m1.upper();
+ MatrixType m2up = m2.upper();
+
+ if (rows*cols>1)
+ {
+ VERIFY(m1up.isUpper());
+ VERIFY(m2up.transpose().isLower());
+ VERIFY(!m2.isLower());
+ }
+
+// VERIFY_IS_APPROX(m1up.transpose() * m2, m1.upper().transpose().lower() * m2);
+
+ // test overloaded operator+=
+ r1.setZero();
+ r2.setZero();
+ r1.upper() += m1;
+ r2 += m1up;
+ VERIFY_IS_APPROX(r1,r2);
+
+ // test overloaded operator=
+ m1.setZero();
+ m1.upper() = m2.transpose() * m2;
+ m3 = m2.transpose() * m2;
+ VERIFY_IS_APPROX(m3.lower().transpose(), m1);
+
+ // test overloaded operator=
+ m1.setZero();
+ m1.lower() = m2.transpose() * m2;
+ VERIFY_IS_APPROX(m3.lower(), m1);
+
+ // test back and forward subsitution
+ m1 = MatrixType::random(rows, cols);
+ VERIFY_IS_APPROX(m1.upper() * (m1.upper().inverseProduct(m2)), m2);
+ VERIFY_IS_APPROX(m1.lower() * (m1.lower().inverseProduct(m2)), m2);
+ VERIFY((m1.upper() * m2.upper()).isUpper());
+
+}
+
+void EigenTest::testTriangular()
+{
+ for(int i = 0; i < m_repeat ; i++) {
+// triangular(Matrix<float, 1, 1>());
+ triangular(Matrix3d());
+ triangular(MatrixXcf(4, 4));
+// triangular(Matrix<std::complex<float>,8, 8>());
+ }
+}
+
+} // namespace Eigen