Advertisement
Guest User

Eigen min/max/cast

a guest
Feb 21st, 2014
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. #include <iostream>
  2. #include <Eigen/Core>
  3. #include <boost/timer.hpp>
  4.  
  5. using namespace std;
  6. using namespace Eigen;
  7.  
  8. typedef unsigned short T;
  9. typedef Matrix<T, 3, 1> Vector3T;
  10.  
  11. const float offset = 3.0f;
  12. const float clamp = 16.0f;
  13.  
  14. // 297 ms
  15. void eigen1(const Matrix3f & mat, T* in, size_t size, T* out) {
  16.     for (size_t i = 0; i < size*4; i += 4) {
  17.         Map<Vector3T> src(in + i);
  18.         Map<Vector3T> dest(out + i);
  19.         dest = ((mat * src.cast<float>()).array() + offset).max(0.0).min(clamp).cast<T>();
  20.     }
  21. }
  22.  
  23. // 255 ms
  24. void eigen2(const Matrix3f & mat, T* in, size_t size, T* out) {
  25.     for (size_t i = 0; i < size*4; i += 4) {
  26.         Vector3f src(in[i + 0], in[i + 1], in[i + 2]);
  27.         Map<Vector3T> dest(out + i);
  28.         dest = ((mat * src).array() + offset).max(0.0).min(clamp).cast<T>();
  29.     }
  30. }
  31.  
  32. // 249 ms
  33. void eigen3(const Matrix3f & mat, T* in, size_t size, T* out) {
  34.     for (size_t i = 0; i < size*4; i += 4) {
  35.         Vector3f src(in[i + 0], in[i + 1], in[i + 2]);
  36.         Vector3f result = ((mat * src).array() + offset).max(0.0).min(clamp);
  37.         out[i + 0] = (T) result(0);
  38.         out[i + 1] = (T) result(1);
  39.         out[i + 2] = (T) result(2);
  40.     }
  41. }
  42.  
  43. // 152 ms
  44. void eigen4(const Matrix3f & mat, T* in, size_t size, T* out) {
  45.     for (size_t i = 0; i < size*4; i += 4) {
  46.         Vector3f src(in[i + 0], in[i + 1], in[i + 2]);
  47.         Vector3f result = mat * src;
  48.         out[i + 0] = (T) max(0.0f, min(clamp, result(0) + offset));
  49.         out[i + 1] = (T) max(0.0f, min(clamp, result(1) + offset));
  50.         out[i + 2] = (T) max(0.0f, min(clamp, result(2) + offset));
  51.     }
  52. }
  53.  
  54. // 163 ms
  55. void manual(const Matrix3f & mat, T* in, size_t size, T* out) {
  56.     for (size_t i = 0; i < size*4; i += 4) {
  57.         float x = in[i + 0];
  58.         float y = in[i + 0];
  59.         float z = in[i + 0];
  60.         out[i + 0] = (T) max(0.0f, min(clamp, x*mat(0,0) + y*mat(0,1) + z*mat(0,2) + offset));
  61.         out[i + 0] = (T) max(0.0f, min(clamp, x*mat(0,0) + y*mat(0,1) + z*mat(0,2) + offset));
  62.         out[i + 0] = (T) max(0.0f, min(clamp, x*mat(0,0) + y*mat(0,1) + z*mat(0,2) + offset));
  63.     }
  64. }
  65.  
  66. int main(int argc, char** argv) {
  67.     Matrix3f mat;
  68.     mat << 10, -1, -2,
  69.            -1, 10, -2,
  70.            -1, -2, 10;
  71.  
  72.     const size_t size = 10000000;
  73.     T* in = new T[size * 4];
  74.     T* out = new T[size * 4];
  75.     for (int i = 0; i < size * 4; ++i) {
  76.         in[i] = i % std::numeric_limits<T>::max();
  77.         out[i] = 0;
  78.     }
  79.  
  80.     boost::timer timer;
  81.  
  82.     if (argc == 2 && strcmp(argv[1], "eigen1") == 0)
  83.     {
  84.         eigen1(mat, in, size, out);
  85.     }
  86.     else if (argc == 2 && strcmp(argv[1], "eigen2") == 0)
  87.     {
  88.         eigen2(mat, in, size, out);
  89.     }
  90.     else if (argc == 2 && strcmp(argv[1], "eigen3") == 0)
  91.     {
  92.         eigen3(mat, in, size, out);
  93.     }
  94.     else if (argc == 2 && strcmp(argv[1], "eigen4") == 0)
  95.     {
  96.         eigen4(mat, in, size, out);
  97.     }
  98.     else if (argc == 2 && strcmp(argv[1], "manual") == 0)
  99.     {
  100.         manual(mat, in, size, out);
  101.     }
  102.     else
  103.     {
  104.         cout << "Usage: " << argv[0] << " eigen1|eigen2|eigen3|eigen4|manual" << endl;
  105.         exit(1);
  106.     }
  107.  
  108.     double elapsed = timer.elapsed();
  109.     cout << elapsed << endl;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement