unique.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include <test_common.h>
  2. #include <igl/unique_rows.h>
  3. #include <igl/matrix_to_list.h>
  4. TEST_CASE("unique: matrix", "[igl]")
  5. {
  6. Eigen::VectorXi A(12);
  7. A = (Eigen::VectorXd::Random(A.size(),1).array().abs()*9).cast<int>();
  8. Eigen::VectorXi C,IA,IC;
  9. igl::unique_rows(A,C,IA,IC);
  10. std::vector<bool> inA(A.maxCoeff()+1,false);
  11. for(int i = 0;i<A.size();i++)
  12. {
  13. inA[A(i)] = true;
  14. REQUIRE (C(IC(i)) == A(i));
  15. }
  16. std::vector<bool> inC(inA.size(),false);
  17. // Expect a column vector
  18. REQUIRE (C.cols() == 1);
  19. for(int i = 0;i<C.size();i++)
  20. {
  21. // Should be the first time finding this
  22. REQUIRE (!inC[C(i)]);
  23. // Mark as found
  24. inC[C(i)] = true;
  25. // Should be something also found in A
  26. REQUIRE (inA[C(i)]);
  27. REQUIRE (A(IA(i)) == C(i));
  28. }
  29. for(int i = 0;i<inC.size();i++)
  30. {
  31. REQUIRE (inA[i] == inC[i]);
  32. }
  33. }
  34. TEST_CASE("unique_rows: matrix", "[igl]")
  35. {
  36. Eigen::MatrixXi A(50,4);
  37. A = (Eigen::MatrixXi::Random(A.rows(),A.cols()).array().abs()*9).cast<int>();
  38. Eigen::MatrixXi C;
  39. Eigen::VectorXi IA,IC;
  40. igl::unique_rows(A,C,IA,IC);
  41. REQUIRE (C.cols() == A.cols());
  42. REQUIRE (IC.size() == A.rows());
  43. REQUIRE (IA.size() == C.rows());
  44. std::map<std::vector<int>,bool> inA;
  45. for(int i = 0;i<A.rows();i++)
  46. {
  47. Eigen::RowVectorXi Ai = A.row(i);
  48. std::vector<int> vAi;
  49. igl::matrix_to_list(Ai,vAi);
  50. inA[vAi] = true;
  51. for(int j = 0;j<A.cols();j++)
  52. {
  53. REQUIRE (C(IC(i),j) == A(i,j));
  54. }
  55. }
  56. std::map<std::vector<int>,bool> inC;
  57. for(int i = 0;i<C.rows();i++)
  58. {
  59. Eigen::RowVectorXi Ci = C.row(i);
  60. std::vector<int> vCi;
  61. igl::matrix_to_list(Ci,vCi);
  62. // Should be the first time finding this
  63. REQUIRE (!inC[vCi]);
  64. // Mark as found
  65. inC[vCi] = true;
  66. // Should be something also found in A
  67. REQUIRE (inA[vCi]);
  68. for(int j = 0;j<A.cols();j++)
  69. {
  70. REQUIRE (A(IA(i),j) == C(i,j));
  71. }
  72. }
  73. REQUIRE (inA.size() == inC.size());
  74. for(const auto pair : inA)
  75. {
  76. REQUIRE (inA[pair.first] == inC[pair.first]);
  77. }
  78. for(const auto pair : inC)
  79. {
  80. REQUIRE (inA[pair.first] == inC[pair.first]);
  81. }
  82. }