27 #ifndef MLN_MATH_JACOBI_HH
28 # define MLN_MATH_JACOBI_HH
34 # include <mln/algebra/quat.hh>
35 # include <mln/algebra/mat.hh>
51 jacobi(algebra::mat<4u,4u,float> a);
54 # ifndef MLN_INCLUDE_ONLY
57 #define rotateJacobi(a,i,j,k,l) g=a(i,j);h=a(k,l);a(i,j)=g-s*(h+g*tau); \
63 jacobi(algebra::mat<4u,4u,float> a)
68 float tresh, theta, tau, t, sm, s, h, g, c, b[4], z[4];
69 for (ip = 0; ip < 4; ip++)
71 for (iq = 0; iq < 4; iq++)
75 for (ip = 0; ip < 4; ip++)
77 b[ip] = d[ip] = a(ip, ip);
83 for (ip = 0; ip < 3; ip++)
85 for (iq = ip + 1; iq < 4; iq++)
86 sm += std::fabs(a(ip, iq));
92 for (ip = 1; ip < 4; ip++)
98 algebra::quat q(v(0, iq), v(1, iq), v(2, iq), v(3, iq));
105 tresh = 0.0125f * sm;
109 for (ip = 0; ip < 3; ip++)
111 for (iq = ip + 1; iq < 4; iq++)
113 g = 100.0f * std::fabs(a(ip, iq));
114 if (i > 4 && (
float)(std::fabs(d[ip]) + g) == (
float)std::fabs(d[ip])
115 && (
float)(std::fabs(d[iq]) + g) == (
float)std::fabs(d[iq]))
117 else if (std::fabs(a(ip, iq)) > tresh)
120 if ((
float)(std::fabs(h) + g) == (
float)std::fabs(h))
124 theta = 0.5f * h / (a(ip, iq));
125 t = 1.0f / (std::fabs(theta) +
std::sqrt(1.0f +
132 tau = s / (1.0f + c);
142 for (j = 0; j <= ip - 1; j++)
144 rotateJacobi(a, j, ip, j, iq);
146 for (j = ip + 1; j <= iq - 1; j++)
148 rotateJacobi(a, ip, j, j, iq);
150 for (j = iq + 1; j < 4; j++)
152 rotateJacobi(a, ip, j, iq, j);
154 for (j = 0; j < 4; j++)
156 rotateJacobi(v, j, ip, j, iq);
161 for (ip = 0; ip < 4; ip++)
170 # endif // ! MLN_INCLUDE_ONLY
177 #endif // ! MLN_MATH_JACOBI_HH