9 #include <boost/variant.hpp>
11 #include <boost/test/unit_test.hpp>
12 #include <boost/utility/binary.hpp>
14 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
20 const Eigen::DenseIndex mat_size = 20;
31 const Eigen::DenseIndex mat_size = 20;
50 PlainMatrixType
mat(mat_size, mat_size);
51 mat = tridiagonal_matrix;
57 for (
int k = 0; k < 1000; ++k)
59 PlainMatrixType
mat = PlainMatrixType::Random(mat_size, mat_size);
61 PlainMatrixType
plain(mat_size, mat_size);
62 plain = tridiagonal_matrix;
64 PlainMatrixType res_apply_on_the_right = tridiagonal_matrix *
mat;
65 PlainMatrixType res_apply_on_the_right_ref =
plain *
mat;
66 BOOST_CHECK(res_apply_on_the_right.isApprox(res_apply_on_the_right_ref));
68 PlainMatrixType res_apply_on_the_left =
mat * tridiagonal_matrix;
69 PlainMatrixType res_apply_on_the_left_ref =
mat *
plain;
70 BOOST_CHECK(res_apply_on_the_left.isApprox(res_apply_on_the_left_ref));
76 const Eigen::DenseIndex mat_size = 20;
89 PlainMatrixType
mat(mat_size, mat_size);
90 mat = tridiagonal_matrix;
98 for (
int k = 0; k < 1000; ++k)
100 PlainMatrixType rhs_mat = PlainMatrixType::Random(mat_size, mat_size);
102 PlainMatrixType
plain(mat_size, mat_size);
103 plain = tridiagonal_matrix;
105 PlainMatrixType
res = tridiagonal_matrix * rhs_mat;
107 PlainMatrixType res_ref =
plain * rhs_mat;
109 BOOST_CHECK((tridiagonal_matrix * PlainMatrixType::Identity(mat_size, mat_size))
117 const Eigen::DenseIndex mat_size = 10;
123 PlainMatrixType plain_mat(mat_size, mat_size);
124 plain_mat = tridiagonal_matrix;
125 const PlainMatrixType plain_mat_inverse = plain_mat.
inverse();
128 tridiagonal_matrix_inverse = tridiagonal_matrix.
inverse();
133 const auto & tridiagonal_matrix_ref = tridiagonal_matrix_inverse.
inverse();
134 BOOST_CHECK(&tridiagonal_matrix_ref == &tridiagonal_matrix);
136 const PlainMatrixType tridiagonal_matrix_inverse_plain = tridiagonal_matrix_inverse;
137 BOOST_CHECK(tridiagonal_matrix_inverse_plain.isApprox(plain_mat_inverse));
140 for (
int k = 0; k < 1; ++k)
142 PlainMatrixType rhs_mat = PlainMatrixType::Random(mat_size, mat_size);
144 PlainMatrixType
res(mat_size, mat_size);
145 res = tridiagonal_matrix_ref * rhs_mat;
149 res = tridiagonal_matrix_inverse * rhs_mat;
150 const PlainMatrixType res_ref = plain_mat_inverse * rhs_mat;
157 Eigen::MatrixXd sub_diagonal_matrix = Eigen::MatrixXd::Zero(mat_size, mat_size);
158 sub_diagonal_matrix.diagonal<1>().setRandom();
159 sub_diagonal_matrix.diagonal().setRandom();
160 sub_diagonal_matrix.diagonal<-1>().setRandom();
162 const Eigen::MatrixXd test_mat = Eigen::MatrixXd::Random(mat_size, mat_size);
163 const Eigen::MatrixXd res_ref = sub_diagonal_matrix * test_mat;
165 Eigen::MatrixXd
res(mat_size, mat_size);
166 res.noalias() = sub_diagonal_matrix.diagonal().asDiagonal() * test_mat;
167 res.topRows(mat_size - 1) +=
168 sub_diagonal_matrix.diagonal<1>().asDiagonal() * test_mat.bottomRows(mat_size - 1);
169 res.bottomRows(mat_size - 1) +=
170 sub_diagonal_matrix.diagonal<-1>().asDiagonal() * test_mat.topRows(mat_size - 1);
175 BOOST_AUTO_TEST_SUITE_END()