9 #include <boost/variant.hpp>
11 #include <boost/test/unit_test.hpp>
12 #include <boost/utility/binary.hpp>
14 #include <Eigen/Eigenvalues>
17 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
23 const Eigen::DenseIndex mat_size = 20;
24 const Eigen::MatrixXd identity_mat = Eigen::MatrixXd::Identity(mat_size, mat_size);
28 BOOST_CHECK(std::fabs(eigen_val - 1.) <= 1e-4);
33 const Eigen::DenseIndex mat_size = 10;
34 const int num_tests = 1000;
35 const int num_it_max = 10;
36 const int num_it_max_finer = 100 * num_it_max;
38 for (
int k = 0; k < num_tests; ++k)
40 const Eigen::MatrixXd
A = Eigen::MatrixXd::Random(mat_size, mat_size);
41 const Eigen::MatrixXd sym_mat = (
A *
A.transpose());
43 const Eigen::EigenSolver<Eigen::MatrixXd> eigen_solver(sym_mat,
true);
44 BOOST_CHECK(eigen_solver.info() == Eigen::Success);
47 Eigen::VectorXd sorted_eigen_values = eigen_solver.eigenvalues().real();
48 std::sort(sorted_eigen_values.data(), sorted_eigen_values.data() + sorted_eigen_values.size());
50 const double eigen_val_ref = sorted_eigen_values[sorted_eigen_values.size() - 1];
55 bool test_relative_eigen_val =
56 std::fabs(eigen_val - eigen_val_ref) / (
std::max)(eigen_val, eigen_val_ref) <= 1e-2;
57 bool test_eigen_vec = (sym_mat * eigen_vec).
isApprox(eigen_val * eigen_vec, 1e-2);
59 if (!test_relative_eigen_val || !test_eigen_vec)
64 test_relative_eigen_val =
65 std::fabs(eigen_val_finer - eigen_val_ref) / (
std::max)(eigen_val_finer, eigen_val_ref)
68 (sym_mat * eigen_vec_finer).
isApprox(eigen_val_finer * eigen_vec_finer, 1e-2);
69 std::cout <<
"res: " << (sym_mat * eigen_vec - eigen_val * eigen_vec).norm() << std::endl;
70 std::cout <<
"eigen_val: " << eigen_val << std::endl;
71 std::cout <<
"eigen_val_finer: " << eigen_val_finer << std::endl;
72 std::cout <<
"eigen_val_ref: " << eigen_val_ref << std::endl;
73 std::cout <<
"res finer: "
74 << (sym_mat * eigen_vec_finer - eigen_val_finer * eigen_vec_finer).norm()
77 BOOST_CHECK(test_relative_eigen_val);
78 BOOST_CHECK(test_eigen_vec);
82 BOOST_AUTO_TEST_SUITE_END()