diagonal.cpp File Reference
#include "main.h"

Functions

template<typename MatrixType >
void diagonal (const MatrixType &m)
 
template<typename MatrixType >
void diagonal_assert (const MatrixType &m)
 
 EIGEN_DECLARE_TEST (diagonal)
 

Function Documentation

◆ diagonal()

template<typename MatrixType >
void diagonal ( const MatrixType m)
13  {
14  typedef typename MatrixType::Scalar Scalar;
15 
16  Index rows = m.rows();
17  Index cols = m.cols();
18 
19  MatrixType m1 = MatrixType::Random(rows, cols), m2 = MatrixType::Random(rows, cols);
20 
21  Scalar s1 = internal::random<Scalar>();
22 
23  // check diagonal()
24  VERIFY_IS_APPROX(m1.diagonal(), m1.transpose().diagonal());
25  m2.diagonal() = 2 * m1.diagonal();
26  m2.diagonal()[0] *= 3;
27 
28  if (rows > 2) {
29  enum { N1 = MatrixType::RowsAtCompileTime > 2 ? 2 : 0, N2 = MatrixType::RowsAtCompileTime > 1 ? -1 : 0 };
30 
31  // check sub/super diagonal
32  if (MatrixType::SizeAtCompileTime != Dynamic) {
33  VERIFY(m1.template diagonal<N1>().RowsAtCompileTime == m1.diagonal(N1).size());
34  VERIFY(m1.template diagonal<N2>().RowsAtCompileTime == m1.diagonal(N2).size());
35  }
36 
37  m2.template diagonal<N1>() = 2 * m1.template diagonal<N1>();
38  VERIFY_IS_APPROX(m2.template diagonal<N1>(), static_cast<Scalar>(2) * m1.diagonal(N1));
39  m2.template diagonal<N1>()[0] *= 3;
40  VERIFY_IS_APPROX(m2.template diagonal<N1>()[0], static_cast<Scalar>(6) * m1.template diagonal<N1>()[0]);
41 
42  m2.template diagonal<N2>() = 2 * m1.template diagonal<N2>();
43  m2.template diagonal<N2>()[0] *= 3;
44  VERIFY_IS_APPROX(m2.template diagonal<N2>()[0], static_cast<Scalar>(6) * m1.template diagonal<N2>()[0]);
45 
46  m2.diagonal(N1) = 2 * m1.diagonal(N1);
47  VERIFY_IS_APPROX(m2.template diagonal<N1>(), static_cast<Scalar>(2) * m1.diagonal(N1));
48  m2.diagonal(N1)[0] *= 3;
49  VERIFY_IS_APPROX(m2.diagonal(N1)[0], static_cast<Scalar>(6) * m1.diagonal(N1)[0]);
50 
51  m2.diagonal(N2) = 2 * m1.diagonal(N2);
52  VERIFY_IS_APPROX(m2.template diagonal<N2>(), static_cast<Scalar>(2) * m1.diagonal(N2));
53  m2.diagonal(N2)[0] *= 3;
54  VERIFY_IS_APPROX(m2.diagonal(N2)[0], static_cast<Scalar>(6) * m1.diagonal(N2)[0]);
55 
56  m2.diagonal(N2).x() = s1;
57  VERIFY_IS_APPROX(m2.diagonal(N2).x(), s1);
58  m2.diagonal(N2).coeffRef(0) = Scalar(2) * s1;
59  VERIFY_IS_APPROX(m2.diagonal(N2).coeff(0), Scalar(2) * s1);
60  }
61 
62  VERIFY(m1.diagonal(cols).size() == 0);
63  VERIFY(m1.diagonal(-rows).size() == 0);
64 }
Matrix3d m1
Definition: IOFormat.cpp:2
MatrixType m2(n_dims)
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
SCALAR Scalar
Definition: bench_gemm.cpp:45
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
int * m
Definition: level2_cplx_impl.h:294
#define VERIFY(a)
Definition: main.h:362
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
const int Dynamic
Definition: Constants.h:25

References cols, Eigen::Dynamic, m, m1, m2(), rows, VERIFY, and VERIFY_IS_APPROX.

Referenced by diagonalmatrices(), ThreeDimBethertonProblem< ELEMENT >::doc_solution(), EIGEN_DECLARE_TEST(), Eigen::internal::TridiagonalizationMatrixTReturnType< MatrixType >::evalTo(), product_notemporary(), Eigen::internal::tridiagonalization_inplace_selector< MatrixType, Size, IsComplex >::run(), sparse_basic(), Eigen::Tridiagonalization< MatrixType_ >::subDiagonal(), Eigen::internal::upperbidiagonalization_blocked_helper(), and Eigen::internal::upperbidiagonalization_inplace_unblocked().

◆ diagonal_assert()

template<typename MatrixType >
void diagonal_assert ( const MatrixType m)
67  {
68  Index rows = m.rows();
69  Index cols = m.cols();
70 
71  MatrixType m1 = MatrixType::Random(rows, cols);
72 
73  if (rows >= 2 && cols >= 2) {
74  VERIFY_RAISES_ASSERT(m1 += m1.diagonal());
75  VERIFY_RAISES_ASSERT(m1 -= m1.diagonal());
76  VERIFY_RAISES_ASSERT(m1.array() *= m1.diagonal().array());
77  VERIFY_RAISES_ASSERT(m1.array() /= m1.diagonal().array());
78  }
79 
80  VERIFY_RAISES_ASSERT(m1.diagonal(cols + 1));
81  VERIFY_RAISES_ASSERT(m1.diagonal(-(rows + 1)));
82 }
#define VERIFY_RAISES_ASSERT(a)
Definition: main.h:329

References cols, m, m1, rows, and VERIFY_RAISES_ASSERT.

Referenced by EIGEN_DECLARE_TEST().

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( diagonal  )
84  {
85  for (int i = 0; i < g_repeat; i++) {
89  CALL_SUBTEST_2(diagonal(Matrix4d()));
91  MatrixXcf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
93  MatrixXi(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
95  MatrixXcd(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
97  MatrixXf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
100  MatrixXf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
101  }
102 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_TEST_MAX_SIZE
Definition: boostmultiprec.cpp:16
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
void diagonal_assert(const MatrixType &m)
Definition: diagonal.cpp:67
void diagonal(const MatrixType &m)
Definition: diagonal.cpp:13
static int g_repeat
Definition: main.h:191
#define CALL_SUBTEST_1(FUNC)
Definition: split_test_helper.h:4
#define CALL_SUBTEST_2(FUNC)
Definition: split_test_helper.h:10

References CALL_SUBTEST_1, CALL_SUBTEST_2, diagonal(), diagonal_assert(), EIGEN_TEST_MAX_SIZE, Eigen::g_repeat, and i.