details.hpp 1.15 KB
Newer Older
1
#pragma once
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#include <boost/math/special_functions/sign.hpp>

namespace itl
{
  namespace details
  {
    /// Compute the Givens rotation matrix parameters for a and b.
    //     template<typename T>
    //     void rotmat(const T& a, const T& b , T& c, T& s)
    //     {
    //       using std::abs; using std::sqrt; using mtl::conj;
    //
    //       const T zero = math::zero(T());
    //       if (a == zero) {
17
18
    // 	        c = 0.0;
    // 	        s = 1.0;
19
    //       } else {
20
21
22
    // 	        double temp = abs(a) / sqrt( conj(a)*a + conj(b)*b );
    // 	        c = temp;
    // 	        s = temp * (b / a);
23
24
25
    //       }
    //     }

26
27
    template <class T>
    inline void rotmat(const T& a, const T& b , T& c, T& s)
28
29
30
31
32
33
34
35
36
37
    {
      using std::abs;
      using std::sqrt;
      if ( b == 0.0 )
      {
        c = 1.0;
        s = 0.0;
      }
      else if ( abs(b) > abs(a) )
      {
38
        T temp = a / b;
39
40
41
42
43
        s = 1.0 / sqrt( 1.0 + temp*temp );
        c = temp * s;
      }
      else
      {
44
        T temp = b / a;
45
46
47
48
49
        c = 1.0 / sqrt( 1.0 + temp*temp );
        s = temp * c;
      }
    }

50
51
  } // end namespace details
} // end namespace itl