transpose_blocks.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #ifndef IGL_TRANSPOSE_BLOCKS_H
  2. #define IGL_TRANSPOSE_BLOCKS_H
  3. #include "igl_inline.h"
  4. #include <Eigen/Core>
  5. namespace igl
  6. {
  7. // Templates:
  8. // T should be a eigen matrix primitive type like int or double
  9. // Inputs:
  10. // A m*k by n (dim: 1) or m by n*k (dim: 2) eigen Matrix of type T values
  11. // k number of blocks
  12. // dim dimension in which to transpose
  13. // Output
  14. // B n*k by m (dim: 1) or n by m*k (dim: 2) eigen Matrix of type T values,
  15. // NOT allowed to be the same as A
  16. //
  17. // Example:
  18. // A = [
  19. // 1 2 3 4
  20. // 5 6 7 8
  21. // 101 102 103 104
  22. // 105 106 107 108
  23. // 201 202 203 204
  24. // 205 206 207 208];
  25. // transpose_blocks(A,1,3,B);
  26. // B -> [
  27. // 1 5
  28. // 2 6
  29. // 3 7
  30. // 4 8
  31. // 101 105
  32. // 102 106
  33. // 103 107
  34. // 104 108
  35. // 201 205
  36. // 202 206
  37. // 203 207
  38. // 204 208];
  39. //
  40. template <typename T>
  41. IGL_INLINE void transpose_blocks(
  42. const Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & A,
  43. const size_t k,
  44. const size_t dim,
  45. Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> & B);
  46. }
  47. #ifdef IGL_HEADER_ONLY
  48. # include "transpose_blocks.cpp"
  49. #endif
  50. #endif