1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "main.h" 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <unsupported/Eigen/MatrixFunctions> 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Variant of VERIFY_IS_APPROX which uses absolute error instead of 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// relative error. 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define VERIFY_IS_APPROX_ABS(a, b) VERIFY(test_isApprox_abs(a, b)) 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Type1, typename Type2> 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool test_isApprox_abs(const Type1& a, const Type2& b) 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ((a-b).array().abs() < test_precision<typename Type1::RealScalar>()).all(); 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Returns a matrix with eigenvalues clustered around 0, 1 and 2. 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrixType randomMatrixWithRealEivals(const typename MatrixType::Index size) 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Index Index; 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Scalar Scalar; 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::RealScalar RealScalar; 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType diag = MatrixType::Zero(size, size); 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index i = 0; i < size; ++i) { 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath diag(i, i) = Scalar(RealScalar(internal::random<int>(0,2))) 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath + internal::random<Scalar>() * Scalar(RealScalar(0.01)); 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType A = MatrixType::Random(size, size); 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath HouseholderQR<MatrixType> QRofA(A); 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return QRofA.householderQ().inverse() * diag * QRofA.householderQ(); 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename MatrixType, int IsComplex = NumTraits<typename internal::traits<MatrixType>::Scalar>::IsComplex> 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct randomMatrixWithImagEivals 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // Returns a matrix with eigenvalues clustered around 0 and +/- i. 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static MatrixType run(const typename MatrixType::Index size); 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Partial specialization for real matrices 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct randomMatrixWithImagEivals<MatrixType, 0> 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static MatrixType run(const typename MatrixType::Index size) 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Index Index; 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Scalar Scalar; 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType diag = MatrixType::Zero(size, size); 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index i = 0; 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while (i < size) { 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index randomInt = internal::random<Index>(-1, 1); 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (randomInt == 0 || i == size-1) { 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath diag(i, i) = internal::random<Scalar>() * Scalar(0.01); 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ++i; 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } else { 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar alpha = Scalar(randomInt) + internal::random<Scalar>() * Scalar(0.01); 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath diag(i, i+1) = alpha; 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath diag(i+1, i) = -alpha; 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath i += 2; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType A = MatrixType::Random(size, size); 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath HouseholderQR<MatrixType> QRofA(A); 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return QRofA.householderQ().inverse() * diag * QRofA.householderQ(); 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Partial specialization for complex matrices 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct randomMatrixWithImagEivals<MatrixType, 1> 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static MatrixType run(const typename MatrixType::Index size) 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Index Index; 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Scalar Scalar; 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::RealScalar RealScalar; 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar imagUnit(0, 1); 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType diag = MatrixType::Zero(size, size); 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index i = 0; i < size; ++i) { 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath diag(i, i) = Scalar(RealScalar(internal::random<Index>(-1, 1))) * imagUnit 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath + internal::random<Scalar>() * Scalar(RealScalar(0.01)); 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType A = MatrixType::Random(size, size); 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath HouseholderQR<MatrixType> QRofA(A); 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return QRofA.householderQ().inverse() * diag * QRofA.householderQ(); 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid testMatrixExponential(const MatrixType& A) 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<MatrixType>::Scalar Scalar; 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef std::complex<RealScalar> ComplexScalar; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(A.exp(), A.matrixFunction(StdStemFunctions<ComplexScalar>::exp)); 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid testMatrixLogarithm(const MatrixType& A) 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<MatrixType>::Scalar Scalar; 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType scaledA; 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RealScalar maxImagPartOfSpectrum = A.eigenvalues().imag().cwiseAbs().maxCoeff(); 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (maxImagPartOfSpectrum >= 0.9 * M_PI) 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath scaledA = A * 0.9 * M_PI / maxImagPartOfSpectrum; 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath scaledA = A; 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // identity X.exp().log() = X only holds if Im(lambda) < pi for all eigenvalues of X 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType expA = scaledA.exp(); 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType logExpA = expA.log(); 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX(logExpA, scaledA); 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid testHyperbolicFunctions(const MatrixType& A) 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // Need to use absolute error because of possible cancellation when 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // adding/subtracting expA and expmA. 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX_ABS(A.sinh(), (A.exp() - (-A).exp()) / 2); 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX_ABS(A.cosh(), (A.exp() + (-A).exp()) / 2); 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid testGonioFunctions(const MatrixType& A) 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Scalar Scalar; 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef std::complex<RealScalar> ComplexScalar; 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<ComplexScalar, MatrixType::RowsAtCompileTime, 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MatrixType::ColsAtCompileTime, MatrixType::Options> ComplexMatrix; 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ComplexScalar imagUnit(0,1); 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ComplexScalar two(2,0); 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ComplexMatrix Ac = A.template cast<ComplexScalar>(); 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ComplexMatrix exp_iA = (imagUnit * Ac).exp(); 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ComplexMatrix exp_miA = (-imagUnit * Ac).exp(); 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ComplexMatrix sinAc = A.sin().template cast<ComplexScalar>(); 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX_ABS(sinAc, (exp_iA - exp_miA) / (two*imagUnit)); 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ComplexMatrix cosAc = A.cos().template cast<ComplexScalar>(); 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VERIFY_IS_APPROX_ABS(cosAc, (exp_iA + exp_miA) / 2); 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid testMatrix(const MatrixType& A) 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath testMatrixExponential(A); 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath testMatrixLogarithm(A); 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath testHyperbolicFunctions(A); 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath testGonioFunctions(A); 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid testMatrixType(const MatrixType& m) 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // Matrices with clustered eigenvalue lead to different code paths 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // in MatrixFunction.h and are thus useful for testing. 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename MatrixType::Index Index; 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index size = m.rows(); 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i = 0; i < g_repeat; i++) { 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath testMatrix(MatrixType::Random(size, size).eval()); 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath testMatrix(randomMatrixWithRealEivals<MatrixType>(size)); 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath testMatrix(randomMatrixWithImagEivals<MatrixType>::run(size)); 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_matrix_function() 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_1(testMatrixType(Matrix<float,1,1>())); 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_2(testMatrixType(Matrix3cf())); 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_3(testMatrixType(MatrixXf(8,8))); 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_4(testMatrixType(Matrix2d())); 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_5(testMatrixType(Matrix<double,5,5,RowMajor>())); 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_6(testMatrixType(Matrix4cd())); 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CALL_SUBTEST_7(testMatrixType(MatrixXd(13,13))); 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 194