mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-09-10 16:33:15 +08:00
add jacobiSvd() method, update test & docs
This commit is contained in:
parent
cd3a9d1ccb
commit
8356bc8d06
@ -331,6 +331,8 @@ template<typename Derived> class MatrixBase
|
|||||||
|
|
||||||
/////////// SVD module ///////////
|
/////////// SVD module ///////////
|
||||||
|
|
||||||
|
JacobiSVD<PlainObject> jacobiSvd(unsigned int computationOptions = 0) const;
|
||||||
|
|
||||||
/////////// Geometry module ///////////
|
/////////// Geometry module ///////////
|
||||||
|
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
|
@ -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
|
#endif // EIGEN_JACOBISVD_H
|
||||||
|
@ -10,6 +10,6 @@ int main()
|
|||||||
cout << "Here is the matrix A:\n" << A << endl;
|
cout << "Here is the matrix A:\n" << A << endl;
|
||||||
VectorXf b = VectorXf::Random(3);
|
VectorXf b = VectorXf::Random(3);
|
||||||
cout << "Here is the right hand side b:\n" << b << endl;
|
cout << "Here is the right hand side b:\n" << b << endl;
|
||||||
JacobiSVD<MatrixXf> svd(A, ComputeThinU | ComputeThinV);
|
cout << "The least-squares solution is:\n"
|
||||||
cout << "The least-squares solution is:\n" << svd.solve(b) << endl;
|
<< A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b) << endl;
|
||||||
}
|
}
|
||||||
|
@ -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>
|
template<typename MatrixType>
|
||||||
void jacobisvd_inf_nan()
|
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_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))) ));
|
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
|
// Test problem size constructors
|
||||||
CALL_SUBTEST_7( JacobiSVD<MatrixXf>(10,10) );
|
CALL_SUBTEST_7( JacobiSVD<MatrixXf>(10,10) );
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user