add jacobiSvd() method, update test & docs

This commit is contained in:
Benoit Jacob 2010-10-17 09:40:52 -04:00
parent cd3a9d1ccb
commit 8356bc8d06
4 changed files with 30 additions and 2 deletions

View File

@ -331,6 +331,8 @@ template<typename Derived> class MatrixBase
/////////// SVD module ///////////
JacobiSVD<PlainObject> jacobiSvd(unsigned int computationOptions = 0) const;
/////////// Geometry module ///////////
template<typename OtherDerived>

View File

@ -657,4 +657,13 @@ struct ei_solve_retval<JacobiSVD<_MatrixType, QRPreconditioner>, Rhs>
}
};
template<typename Derived>
JacobiSVD<typename MatrixBase<Derived>::PlainObject>
MatrixBase<Derived>::jacobiSvd(unsigned int computationOptions) const
{
return JacobiSVD<PlainObject>(*this, computationOptions);
}
#endif // EIGEN_JACOBISVD_H

View File

@ -10,6 +10,6 @@ int main()
cout << "Here is the matrix A:\n" << A << endl;
VectorXf b = VectorXf::Random(3);
cout << "Here is the right hand side b:\n" << b << endl;
JacobiSVD<MatrixXf> svd(A, ComputeThinU | ComputeThinV);
cout << "The least-squares solution is:\n" << svd.solve(b) << endl;
cout << "The least-squares solution is:\n"
<< A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b) << endl;
}

View File

@ -196,6 +196,19 @@ template<typename MatrixType> void jacobisvd_verify_assert(const MatrixType& m)
}
}
template<typename MatrixType>
void jacobisvd_method()
{
enum { Size = MatrixType::RowsAtCompileTime };
typedef typename MatrixType::RealScalar RealScalar;
typedef Matrix<RealScalar, Size, 1> RealVecType;
MatrixType m = MatrixType::Identity();
VERIFY_IS_APPROX(m.jacobiSvd().singularValues(), RealVecType::Ones());
VERIFY_RAISES_ASSERT(m.jacobiSvd().matrixU());
VERIFY_RAISES_ASSERT(m.jacobiSvd().matrixV());
VERIFY_IS_APPROX(m.jacobiSvd(ComputeFullU|ComputeFullV).solve(m), m);
}
template<typename MatrixType>
void jacobisvd_inf_nan()
{
@ -256,6 +269,10 @@ void test_jacobisvd()
CALL_SUBTEST_7(( jacobisvd<MatrixXf>(MatrixXf(ei_random<int>(100, 150), ei_random<int>(100, 150))) ));
CALL_SUBTEST_8(( jacobisvd<MatrixXcd>(MatrixXcd(ei_random<int>(80, 100), ei_random<int>(80, 100))) ));
// test matrixbase method
CALL_SUBTEST_1(( jacobisvd_method<Matrix2cd>() ));
CALL_SUBTEST_3(( jacobisvd_method<Matrix3f>() ));
// Test problem size constructors
CALL_SUBTEST_7( JacobiSVD<MatrixXf>(10,10) );
}