slice_into.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include <test_common.h>
  2. #include <igl/slice_into.h>
  3. #include <igl/LinSpaced.h>
  4. TEST_CASE("slice_into: dense_identity", "[igl]")
  5. {
  6. Eigen::MatrixXd A = Eigen::MatrixXd::Random(10,9);
  7. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),0,A.rows()-1);
  8. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),0,A.cols()-1);
  9. {
  10. Eigen::MatrixXd B(I.maxCoeff()+1,J.maxCoeff()+1);
  11. igl::slice_into(A,I,J,B);
  12. test_common::assert_eq(A,B);
  13. }
  14. {
  15. Eigen::MatrixXd B(I.maxCoeff()+1,A.cols());
  16. igl::slice_into(A,I,1,B);
  17. test_common::assert_eq(A,B);
  18. }
  19. {
  20. Eigen::MatrixXd B(A.rows(),J.maxCoeff()+1);
  21. igl::slice_into(A,J,2,B);
  22. test_common::assert_eq(A,B);
  23. }
  24. }
  25. TEST_CASE("slice_into: density_reverse", "[igl]")
  26. {
  27. {
  28. Eigen::MatrixXd A = Eigen::MatrixXd::Random(10,9);
  29. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),A.rows()-1,0);
  30. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),0,A.cols()-1);
  31. Eigen::MatrixXd B(I.maxCoeff()+1,J.maxCoeff()+1);
  32. igl::slice_into(A,I,J,B);
  33. // reverse rows (i.e., reverse each column vector)
  34. Eigen::MatrixXd C = A.colwise().reverse().eval();
  35. test_common::assert_eq(B,C);
  36. }
  37. {
  38. Eigen::MatrixXd A = Eigen::MatrixXd::Random(10,9);
  39. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),0,A.rows()-1);
  40. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),A.cols()-1,0);
  41. Eigen::MatrixXd B(I.maxCoeff()+1,J.maxCoeff()+1);
  42. igl::slice_into(A,I,J,B);
  43. // reverse cols (i.e., reverse each row vector)
  44. Eigen::MatrixXd C = A.rowwise().reverse().eval();
  45. test_common::assert_eq(B,C);
  46. }
  47. }
  48. TEST_CASE("slice_into: sparse_identity", "[igl]")
  49. {
  50. Eigen::SparseMatrix<double> A = Eigen::MatrixXd::Random(10,9).sparseView();
  51. Eigen::VectorXi I = igl::LinSpaced<Eigen::VectorXi >(A.rows(),0,A.rows()-1);
  52. Eigen::VectorXi J = igl::LinSpaced<Eigen::VectorXi >(A.cols(),0,A.cols()-1);
  53. {
  54. Eigen::SparseMatrix<double> B(I.maxCoeff()+1,J.maxCoeff()+1);
  55. igl::slice_into(A,I,J,B);
  56. test_common::assert_eq(A,B);
  57. }
  58. {
  59. Eigen::SparseMatrix<double> B(I.maxCoeff()+1,A.cols());
  60. igl::slice_into(A,I,1,B);
  61. test_common::assert_eq(A,B);
  62. }
  63. {
  64. Eigen::SparseMatrix<double> B(A.rows(),J.maxCoeff()+1);
  65. igl::slice_into(A,J,2,B);
  66. test_common::assert_eq(A,B);
  67. }
  68. }
  69. #include <iostream>
  70. #include <igl/matlab_format.h>
  71. TEST_CASE("slice_into: every-other", "[igl]")
  72. {
  73. Eigen::MatrixXd Af(2,2);
  74. Af<<
  75. 1,0,
  76. 5,6;
  77. Eigen::SparseMatrix<double> As = Af.sparseView();
  78. Eigen::MatrixXd Bf(4,4);
  79. Bf<<
  80. 0,5,0,3,
  81. 0,6,0,4,
  82. 3,0,1,5,
  83. 4,8,0,0;
  84. Eigen::SparseMatrix<double> Bs = Bf.sparseView();
  85. Eigen::VectorXi R(2);
  86. R<<1,3;
  87. Eigen::VectorXi C(2);
  88. C<<1,3;
  89. igl::slice_into(Af,R,C,Bf);
  90. igl::slice_into(As,R,C,Bs);
  91. Eigen::MatrixXd res(4,4);
  92. res<<
  93. 0,5,0,3,
  94. 0,1,0,0,
  95. 3,0,1,5,
  96. 4,5,0,6;
  97. test_common::assert_eq(Bf,res);
  98. test_common::assert_eq(Eigen::MatrixXd(Bs),res);
  99. }