num_dimensions.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // This file is part of Eigen, a lightweight C++ template library
  2. // for linear algebra.
  3. //
  4. // Copyright (C) 2018 Gael Guennebaud <gael.guennebaud@inria.fr>
  5. //
  6. // This Source Code Form is subject to the terms of the Mozilla
  7. // Public License v. 2.0. If a copy of the MPL was not distributed
  8. // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
  9. #include "main.h"
  10. #include <Eigen/SparseCore>
  11. template<int ExpectedDim,typename Xpr>
  12. void check_dim(const Xpr& ) {
  13. STATIC_CHECK( Xpr::NumDimensions == ExpectedDim );
  14. }
  15. #if EIGEN_HAS_CXX11
  16. template<template <typename,int,int> class Object>
  17. void map_num_dimensions()
  18. {
  19. typedef Object<double, 1, 1> ArrayScalarType;
  20. typedef Object<double, 2, 1> ArrayVectorType;
  21. typedef Object<double, 1, 2> TransposeArrayVectorType;
  22. typedef Object<double, 2, 2> ArrayType;
  23. typedef Object<double, Eigen::Dynamic, 1> DynamicArrayVectorType;
  24. typedef Object<double, 1, Eigen::Dynamic> DynamicTransposeArrayVectorType;
  25. typedef Object<double, Eigen::Dynamic, Eigen::Dynamic> DynamicArrayType;
  26. STATIC_CHECK(ArrayScalarType::NumDimensions == 0);
  27. STATIC_CHECK(ArrayVectorType::NumDimensions == 1);
  28. STATIC_CHECK(TransposeArrayVectorType::NumDimensions == 1);
  29. STATIC_CHECK(ArrayType::NumDimensions == 2);
  30. STATIC_CHECK(DynamicArrayVectorType::NumDimensions == 1);
  31. STATIC_CHECK(DynamicTransposeArrayVectorType::NumDimensions == 1);
  32. STATIC_CHECK(DynamicArrayType::NumDimensions == 2);
  33. typedef Eigen::Map<ArrayScalarType> ArrayScalarMap;
  34. typedef Eigen::Map<ArrayVectorType> ArrayVectorMap;
  35. typedef Eigen::Map<TransposeArrayVectorType> TransposeArrayVectorMap;
  36. typedef Eigen::Map<ArrayType> ArrayMap;
  37. typedef Eigen::Map<DynamicArrayVectorType> DynamicArrayVectorMap;
  38. typedef Eigen::Map<DynamicTransposeArrayVectorType> DynamicTransposeArrayVectorMap;
  39. typedef Eigen::Map<DynamicArrayType> DynamicArrayMap;
  40. STATIC_CHECK(ArrayScalarMap::NumDimensions == 0);
  41. STATIC_CHECK(ArrayVectorMap::NumDimensions == 1);
  42. STATIC_CHECK(TransposeArrayVectorMap::NumDimensions == 1);
  43. STATIC_CHECK(ArrayMap::NumDimensions == 2);
  44. STATIC_CHECK(DynamicArrayVectorMap::NumDimensions == 1);
  45. STATIC_CHECK(DynamicTransposeArrayVectorMap::NumDimensions == 1);
  46. STATIC_CHECK(DynamicArrayMap::NumDimensions == 2);
  47. }
  48. template<typename Scalar, int Rows, int Cols>
  49. using TArray = Array<Scalar,Rows,Cols>;
  50. template<typename Scalar, int Rows, int Cols>
  51. using TMatrix = Matrix<Scalar,Rows,Cols>;
  52. #endif
  53. EIGEN_DECLARE_TEST(num_dimensions)
  54. {
  55. int n = 10;
  56. ArrayXXd A(n,n);
  57. CALL_SUBTEST( check_dim<2>(A) );
  58. CALL_SUBTEST( check_dim<2>(A.block(1,1,2,2)) );
  59. CALL_SUBTEST( check_dim<1>(A.col(1)) );
  60. CALL_SUBTEST( check_dim<1>(A.row(1)) );
  61. MatrixXd M(n,n);
  62. CALL_SUBTEST( check_dim<0>(M.row(1)*M.col(1)) );
  63. SparseMatrix<double> S(n,n);
  64. CALL_SUBTEST( check_dim<2>(S) );
  65. CALL_SUBTEST( check_dim<2>(S.block(1,1,2,2)) );
  66. CALL_SUBTEST( check_dim<1>(S.col(1)) );
  67. CALL_SUBTEST( check_dim<1>(S.row(1)) );
  68. SparseVector<double> s(n);
  69. CALL_SUBTEST( check_dim<1>(s) );
  70. CALL_SUBTEST( check_dim<1>(s.head(2)) );
  71. #if EIGEN_HAS_CXX11
  72. CALL_SUBTEST( map_num_dimensions<TArray>() );
  73. CALL_SUBTEST( map_num_dimensions<TMatrix>() );
  74. #endif
  75. }