slice.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include <test_common.h>
  2. #include <igl/slice.h>
  3. #include <igl/LinSpaced.h>
  4. TEST_CASE("slice: dense_identity", "[igl]")
  5. {
  6. // https://en.wikipedia.org/wiki/Monkey_testing
  7. Eigen::MatrixXd A = Eigen::MatrixXd::Random(10,9);
  8. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),0,A.rows()-1);
  9. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),0,A.cols()-1);
  10. {
  11. Eigen::MatrixXd B;
  12. igl::slice(A,I,J,B);
  13. test_common::assert_eq(A,B);
  14. }
  15. {
  16. Eigen::MatrixXd B;
  17. igl::slice(A,I,1,B);
  18. test_common::assert_eq(A,B);
  19. }
  20. {
  21. Eigen::MatrixXd B;
  22. igl::slice(A,J,2,B);
  23. test_common::assert_eq(A,B);
  24. }
  25. }
  26. TEST_CASE("slice: sparse_identity", "[igl]")
  27. {
  28. Eigen::SparseMatrix<double> A = Eigen::MatrixXd::Random(10,9).sparseView();
  29. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),0,A.rows()-1);
  30. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),0,A.cols()-1);
  31. {
  32. Eigen::SparseMatrix<double> B;
  33. igl::slice(A,I,J,B);
  34. test_common::assert_eq(A,B);
  35. }
  36. {
  37. Eigen::SparseMatrix<double> B;
  38. igl::slice(A,I,1,B);
  39. test_common::assert_eq(A,B);
  40. }
  41. {
  42. Eigen::SparseMatrix<double> B;
  43. igl::slice(A,J,2,B);
  44. test_common::assert_eq(A,B);
  45. }
  46. }
  47. TEST_CASE("slice: density_reverse", "[igl]")
  48. {
  49. {
  50. Eigen::MatrixXd A = Eigen::MatrixXd::Random(10,9);
  51. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),A.rows()-1,0);
  52. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),0,A.cols()-1);
  53. Eigen::MatrixXd B;
  54. igl::slice(A,I,J,B);
  55. // reverse rows (i.e., reverse each column vector)
  56. Eigen::MatrixXd C = A.colwise().reverse().eval();
  57. test_common::assert_eq(B,C);
  58. }
  59. {
  60. Eigen::MatrixXd A = Eigen::MatrixXd::Random(10,9);
  61. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),0,A.rows()-1);
  62. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),A.cols()-1,0);
  63. Eigen::MatrixXd B;
  64. igl::slice(A,I,J,B);
  65. // reverse cols (i.e., reverse each row vector)
  66. Eigen::MatrixXd C = A.rowwise().reverse().eval();
  67. test_common::assert_eq(B,C);
  68. }
  69. }
  70. TEST_CASE("slice: random", "[igl]")
  71. {
  72. // Test whether unsorted indices are handled correctly by Randomly grow and
  73. // shrink a matrix by slicing out rows and columns: note that growing will
  74. // test whether repeated indices are correctly handled
  75. std::vector<std::pair<int,int> > sizes = {{30,27},{3,4}};
  76. for(const auto & size : sizes)
  77. {
  78. Eigen::MatrixXd A(10,9);
  79. for(int i = 0;i<A.rows();i++)
  80. {
  81. for(int j = 0;j<A.cols();j++)
  82. {
  83. A(i,j) = A.rows()*j + i;
  84. }
  85. }
  86. Eigen::VectorXi I =
  87. ((Eigen::VectorXd::Random(size.first,1).array()*0.5+0.5)*A.rows()
  88. ).cast<int>();
  89. Eigen::VectorXi J =
  90. ((Eigen::VectorXd::Random(size.second,1).array()*0.5+0.5)*A.cols()
  91. ).cast<int>();
  92. Eigen::MatrixXd B;
  93. igl::slice(A,I,J,B);
  94. Eigen::MatrixXd C(I.size(),J.size());
  95. for(int i = 0;i<I.size();i++)
  96. {
  97. for(int j = 0;j<J.size();j++)
  98. {
  99. C(i,j) = A.rows()*J(j) + I(i);
  100. }
  101. }
  102. test_common::assert_eq(B,C);
  103. }
  104. }