MCPcopy Create free account
hub / github.com/PX4/eigen / diagonalmatrices

Function diagonalmatrices

test/diagonalmatrices.cpp:12–102  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

10#include "main.h"
11using namespace std;
12template<typename MatrixType> void diagonalmatrices(const MatrixType& m)
13{
14 typedef typename MatrixType::Index Index;
15 typedef typename MatrixType::Scalar Scalar;
16 enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime };
17 typedef Matrix<Scalar, Rows, 1> VectorType;
18 typedef Matrix<Scalar, 1, Cols> RowVectorType;
19 typedef Matrix<Scalar, Rows, Rows> SquareMatrixType;
20 typedef Matrix<Scalar, Dynamic, Dynamic> DynMatrixType;
21 typedef DiagonalMatrix<Scalar, Rows> LeftDiagonalMatrix;
22 typedef DiagonalMatrix<Scalar, Cols> RightDiagonalMatrix;
23 typedef Matrix<Scalar, Rows==Dynamic?Dynamic:2*Rows, Cols==Dynamic?Dynamic:2*Cols> BigMatrix;
24 Index rows = m.rows();
25 Index cols = m.cols();
26
27 MatrixType m1 = MatrixType::Random(rows, cols),
28 m2 = MatrixType::Random(rows, cols);
29 VectorType v1 = VectorType::Random(rows),
30 v2 = VectorType::Random(rows);
31 RowVectorType rv1 = RowVectorType::Random(cols),
32 rv2 = RowVectorType::Random(cols);
33 LeftDiagonalMatrix ldm1(v1), ldm2(v2);
34 RightDiagonalMatrix rdm1(rv1), rdm2(rv2);
35
36 Scalar s1 = internal::random<Scalar>();
37
38 SquareMatrixType sq_m1 (v1.asDiagonal());
39 VERIFY_IS_APPROX(sq_m1, v1.asDiagonal().toDenseMatrix());
40 sq_m1 = v1.asDiagonal();
41 VERIFY_IS_APPROX(sq_m1, v1.asDiagonal().toDenseMatrix());
42 SquareMatrixType sq_m2 = v1.asDiagonal();
43 VERIFY_IS_APPROX(sq_m1, sq_m2);
44
45 ldm1 = v1.asDiagonal();
46 LeftDiagonalMatrix ldm3(v1);
47 VERIFY_IS_APPROX(ldm1.diagonal(), ldm3.diagonal());
48 LeftDiagonalMatrix ldm4 = v1.asDiagonal();
49 VERIFY_IS_APPROX(ldm1.diagonal(), ldm4.diagonal());
50
51 sq_m1.block(0,0,rows,rows) = ldm1;
52 VERIFY_IS_APPROX(sq_m1, ldm1.toDenseMatrix());
53 sq_m1.transpose() = ldm1;
54 VERIFY_IS_APPROX(sq_m1, ldm1.toDenseMatrix());
55
56 Index i = internal::random<Index>(0, rows-1);
57 Index j = internal::random<Index>(0, cols-1);
58
59 VERIFY_IS_APPROX( ((ldm1 * m1)(i,j)) , ldm1.diagonal()(i) * m1(i,j) );
60 VERIFY_IS_APPROX( ((ldm1 * (m1+m2))(i,j)) , ldm1.diagonal()(i) * (m1+m2)(i,j) );
61 VERIFY_IS_APPROX( ((m1 * rdm1)(i,j)) , rdm1.diagonal()(j) * m1(i,j) );
62 VERIFY_IS_APPROX( ((v1.asDiagonal() * m1)(i,j)) , v1(i) * m1(i,j) );
63 VERIFY_IS_APPROX( ((m1 * rv1.asDiagonal())(i,j)) , rv1(j) * m1(i,j) );
64 VERIFY_IS_APPROX( (((v1+v2).asDiagonal() * m1)(i,j)) , (v1+v2)(i) * m1(i,j) );
65 VERIFY_IS_APPROX( (((v1+v2).asDiagonal() * (m1+m2))(i,j)) , (v1+v2)(i) * (m1+m2)(i,j) );
66 VERIFY_IS_APPROX( ((m1 * (rv1+rv2).asDiagonal())(i,j)) , (rv1+rv2)(j) * m1(i,j) );
67 VERIFY_IS_APPROX( (((m1+m2) * (rv1+rv2).asDiagonal())(i,j)) , (rv1+rv2)(j) * (m1+m2)(i,j) );
68
69 if(rows>1)

Callers 1

test_diagonalmatricesFunction · 0.85

Calls 7

asDiagonalMethod · 0.80
rowsMethod · 0.45
colsMethod · 0.45
toDenseMatrixMethod · 0.45
diagonalMethod · 0.45
transposeMethod · 0.45
setZeroMethod · 0.45

Tested by 1

test_diagonalmatricesFunction · 0.68