Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "main.h"
00026 #include <Eigen/QR>
00027
00028 template<typename MatrixType> void qr(const MatrixType& m)
00029 {
00030
00031
00032
00033 int rows = m.rows();
00034 int cols = m.cols();
00035
00036 typedef typename MatrixType::Scalar Scalar;
00037 typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> SquareMatrixType;
00038 typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, 1> VectorType;
00039
00040 MatrixType a = MatrixType::Random(rows,cols);
00041 QR<MatrixType> qrOfA(a);
00042 VERIFY_IS_APPROX(a, qrOfA.matrixQ() * qrOfA.matrixR());
00043 VERIFY_IS_NOT_APPROX(a+MatrixType::Identity(rows, cols), qrOfA.matrixQ() * qrOfA.matrixR());
00044
00045 #if 0 // eigenvalues module not yet ready
00046 SquareMatrixType b = a.adjoint() * a;
00047
00048
00049 Tridiagonalization<SquareMatrixType> tridiag(b);
00050 VERIFY_IS_APPROX(b, tridiag.matrixQ() * tridiag.matrixT() * tridiag.matrixQ().adjoint());
00051
00052
00053 HessenbergDecomposition<SquareMatrixType> hess(b);
00054 VERIFY_IS_APPROX(b, hess.matrixQ() * hess.matrixH() * hess.matrixQ().adjoint());
00055 VERIFY_IS_APPROX(tridiag.matrixT(), hess.matrixH());
00056 b = SquareMatrixType::Random(cols,cols);
00057 hess.compute(b);
00058 VERIFY_IS_APPROX(b, hess.matrixQ() * hess.matrixH() * hess.matrixQ().adjoint());
00059 #endif
00060 }
00061
00062 void test_eigen2_qr()
00063 {
00064 for(int i = 0; i < 1; i++) {
00065 CALL_SUBTEST_1( qr(Matrix2f()) );
00066 CALL_SUBTEST_2( qr(Matrix4d()) );
00067 CALL_SUBTEST_3( qr(MatrixXf(12,8)) );
00068 CALL_SUBTEST_4( qr(MatrixXcd(5,5)) );
00069 CALL_SUBTEST_4( qr(MatrixXcd(7,3)) );
00070 }
00071
00072 #ifdef EIGEN_TEST_PART_5
00073
00074 {
00075 Matrix3d mat;
00076 mat << 1, 45, 1, 2, 2, 2, 1, 2, 3;
00077 VERIFY(mat.qr().isFullRank());
00078 mat << 1, 1, 1, 2, 2, 2, 1, 2, 3;
00079
00080
00081 }
00082
00083 #endif
00084 }