slice.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include <test_common.h>
  2. #include <igl/LinSpaced.h>
  3. #include <igl/randperm.h>
  4. // We don't want to include dense slices in the static library so include them
  5. // via header only mode for these tests (which themselves will eventually be
  6. // deprecated, too).
  7. #ifdef IGL_STATIC_LIBRARY
  8. # undef IGL_STATIC_LIBRARY
  9. # include <igl/slice.h>
  10. # define IGL_STATIC_LIBRARY
  11. #else
  12. # include <igl/slice.h>
  13. #endif
  14. TEST_CASE("slice: eigen-simple", "[igl]")
  15. {
  16. Eigen::MatrixXd X = Eigen::MatrixXd::Random(10,3);
  17. Eigen::VectorXi I(2); I<<1,0;
  18. {
  19. Eigen::MatrixXd Yigl;
  20. igl::slice(X,I,1,Yigl);
  21. Eigen::MatrixXd Yeigen = X(I,Eigen::all);
  22. test_common::assert_eq(Yigl,Yeigen);
  23. }
  24. {
  25. Eigen::MatrixXd Yigl;
  26. igl::slice(X,I,2,Yigl);
  27. Eigen::MatrixXd Yeigen = X(Eigen::all,I);
  28. test_common::assert_eq(Yigl,Yeigen);
  29. }
  30. }
  31. TEST_CASE("slice: eigen-random", "[igl]")
  32. {
  33. const int m = 100;
  34. const int n = 100;
  35. Eigen::MatrixXd X = Eigen::MatrixXd::Random(m,n);
  36. Eigen::VectorXi I;
  37. igl::randperm(m,I);
  38. Eigen::VectorXi J;
  39. igl::randperm(n,J);
  40. {
  41. Eigen::MatrixXd Yigl;
  42. igl::slice(X,I,J,Yigl);
  43. Eigen::MatrixXd Yeigen = X(I,J);
  44. test_common::assert_eq(Yigl,Yeigen);
  45. }
  46. {
  47. Eigen::MatrixXd Yigl;
  48. igl::slice(X,I,1,Yigl);
  49. Eigen::MatrixXd Yeigen = X(I,Eigen::all);
  50. test_common::assert_eq(Yigl,Yeigen);
  51. }
  52. {
  53. Eigen::MatrixXd Yigl;
  54. igl::slice(X,J,2,Yigl);
  55. Eigen::MatrixXd Yeigen = X(Eigen::all,J);
  56. test_common::assert_eq(Yigl,Yeigen);
  57. }
  58. }
  59. TEST_CASE("slice: dense_identity", "[igl]")
  60. {
  61. // https://en.wikipedia.org/wiki/Monkey_testing
  62. Eigen::MatrixXd A = Eigen::MatrixXd::Random(10,9);
  63. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),0,A.rows()-1);
  64. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),0,A.cols()-1);
  65. {
  66. Eigen::MatrixXd B;
  67. igl::slice(A,I,J,B);
  68. test_common::assert_eq(A,B);
  69. }
  70. {
  71. Eigen::MatrixXd B;
  72. igl::slice(A,I,1,B);
  73. test_common::assert_eq(A,B);
  74. }
  75. {
  76. Eigen::MatrixXd B;
  77. igl::slice(A,J,2,B);
  78. test_common::assert_eq(A,B);
  79. }
  80. }
  81. TEST_CASE("slice: sparse_identity", "[igl]")
  82. {
  83. Eigen::SparseMatrix<double> A = Eigen::MatrixXd::Random(10,9).sparseView();
  84. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),0,A.rows()-1);
  85. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),0,A.cols()-1);
  86. {
  87. Eigen::SparseMatrix<double> B;
  88. igl::slice(A,I,J,B);
  89. test_common::assert_eq(A,B);
  90. }
  91. {
  92. Eigen::SparseMatrix<double> B;
  93. igl::slice(A,I,1,B);
  94. test_common::assert_eq(A,B);
  95. }
  96. {
  97. Eigen::SparseMatrix<double> B;
  98. igl::slice(A,J,2,B);
  99. test_common::assert_eq(A,B);
  100. }
  101. }
  102. TEST_CASE("slice: density_reverse", "[igl]")
  103. {
  104. {
  105. Eigen::MatrixXd A = Eigen::MatrixXd::Random(10,9);
  106. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),A.rows()-1,0);
  107. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),0,A.cols()-1);
  108. Eigen::MatrixXd B;
  109. igl::slice(A,I,J,B);
  110. // reverse rows (i.e., reverse each column vector)
  111. Eigen::MatrixXd C = A.colwise().reverse().eval();
  112. test_common::assert_eq(B,C);
  113. }
  114. {
  115. Eigen::MatrixXd A = Eigen::MatrixXd::Random(10,9);
  116. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),0,A.rows()-1);
  117. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),A.cols()-1,0);
  118. Eigen::MatrixXd B;
  119. igl::slice(A,I,J,B);
  120. // reverse cols (i.e., reverse each row vector)
  121. Eigen::MatrixXd C = A.rowwise().reverse().eval();
  122. test_common::assert_eq(B,C);
  123. }
  124. }
  125. TEST_CASE("slice: random", "[igl]")
  126. {
  127. // Test whether unsorted indices are handled correctly by Randomly grow and
  128. // shrink a matrix by slicing out rows and columns: note that growing will
  129. // test whether repeated indices are correctly handled
  130. std::vector<std::pair<int,int> > sizes = {{30,27},{3,4}};
  131. for(const auto & size : sizes)
  132. {
  133. Eigen::MatrixXd A(10,9);
  134. for(int i = 0;i<A.rows();i++)
  135. {
  136. for(int j = 0;j<A.cols();j++)
  137. {
  138. A(i,j) = A.rows()*j + i;
  139. }
  140. }
  141. Eigen::VectorXi I =
  142. ((Eigen::VectorXd::Random(size.first,1).array()*0.5+0.5)*A.rows()
  143. ).cast<int>();
  144. Eigen::VectorXi J =
  145. ((Eigen::VectorXd::Random(size.second,1).array()*0.5+0.5)*A.cols()
  146. ).cast<int>();
  147. Eigen::MatrixXd B;
  148. igl::slice(A,I,J,B);
  149. Eigen::MatrixXd C(I.size(),J.size());
  150. for(int i = 0;i<I.size();i++)
  151. {
  152. for(int j = 0;j<J.size();j++)
  153. {
  154. C(i,j) = A.rows()*J(j) + I(i);
  155. }
  156. }
  157. test_common::assert_eq(B,C);
  158. }
  159. }