example.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // g++ -o main main.cpp -I. -I/usr/local/include/eigen3
  2. #include <Eigen/Core>
  3. #include <iostream>
  4. using namespace std;
  5. #include <igl/sort.h>
  6. using namespace igl;
  7. #include <cstdio>
  8. template <typename T>
  9. void matlab_print(const string name, const T & X)
  10. {
  11. cout<<name<<"=["<<endl<<X<<endl<<"];"<<endl;
  12. }
  13. int main(int argc, char * argv[])
  14. {
  15. Eigen::MatrixXd X(2,3);
  16. X << 3,5,2,1,3,8;
  17. matlab_print("X",X);
  18. // sort each row independently
  19. int dim = 2;
  20. // sort ascending order
  21. int ascending = true;
  22. // Sorted output matrix
  23. Eigen::MatrixXd Y;
  24. // sorted indices for sort dimension
  25. Eigen::MatrixXi IX;
  26. sort(X,dim,ascending,Y,IX);
  27. matlab_print<Eigen::MatrixXd>("Y",Y);
  28. matlab_print<Eigen::MatrixXi>("IX",IX);
  29. // Verify that IX really does sort X into Y
  30. int num_outer = (dim == 1 ? X.cols() : X.rows() );
  31. // get number of rows (or columns)
  32. int num_inner = (dim == 1 ? X.rows() : X.cols() );
  33. bool verified = true;
  34. for(int i = 0;i<num_outer;i++)
  35. {
  36. for(int j = 0;j<num_inner;j++)
  37. {
  38. if(dim == 1)
  39. {
  40. if( Y(j,i) != X(IX(j,i),i))
  41. {
  42. printf("Y(%d,%d) = %g != %g = X(%d,%d) = X(IX(%d,%d),%d)\n",
  43. j,i,Y(j,i),X(IX(j,i),i),IX(j,i),i,j,i,i);
  44. verified = false;
  45. }
  46. }else
  47. {
  48. if( Y(i,j) != X(i,IX(i,j)))
  49. {
  50. printf("Y(%d,%d) = %g != %g = X(%d,%d) = X(IX(%d,%d),%d)\n",
  51. i,j,Y(i,j),X(i,IX(i,j)),IX(i,j),i,i,j,i);
  52. verified = false;
  53. }
  54. }
  55. }
  56. }
  57. if(verified)
  58. {
  59. printf("Sorting succeeded\n");
  60. }else
  61. {
  62. printf("Sorting failed\n");
  63. }
  64. return (verified?0:1);
  65. }