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/SVD>
00027
00028 template<typename MatrixType> void upperbidiag(const MatrixType& m)
00029 {
00030 const typename MatrixType::Index rows = m.rows();
00031 const typename MatrixType::Index cols = m.cols();
00032
00033 typedef typename MatrixType::Scalar Scalar;
00034 typedef Matrix<typename MatrixType::RealScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime> RealMatrixType;
00035
00036 MatrixType a = MatrixType::Random(rows,cols);
00037 internal::UpperBidiagonalization<MatrixType> ubd(a);
00038 RealMatrixType b(rows, cols);
00039 b.setZero();
00040 b.block(0,0,cols,cols) = ubd.bidiagonal();
00041 MatrixType c = ubd.householderU() * b * ubd.householderV().adjoint();
00042 VERIFY_IS_APPROX(a,c);
00043 }
00044
00045 void test_upperbidiagonalization()
00046 {
00047 for(int i = 0; i < g_repeat; i++) {
00048 CALL_SUBTEST_1( upperbidiag(MatrixXf(3,3)) );
00049 CALL_SUBTEST_2( upperbidiag(MatrixXd(17,12)) );
00050 CALL_SUBTEST_3( upperbidiag(MatrixXcf(20,20)) );
00051 CALL_SUBTEST_4( upperbidiag(MatrixXcd(16,15)) );
00052 CALL_SUBTEST_5( upperbidiag(Matrix<float,6,4>()) );
00053 CALL_SUBTEST_6( upperbidiag(Matrix<float,5,5>()) );
00054 CALL_SUBTEST_7( upperbidiag(Matrix<double,4,3>()) );
00055 }
00056 }