11 #ifndef SYMMETRIC_TENSOR_HPP
12 #define SYMMETRIC_TENSOR_HPP
15 #include <gsl/gsl_matrix.h>
16 #include <gsl/gsl_vector.h>
17 #include <gsl/gsl_eigen.h>
23 typedef Vector<3, float>
Point3f;
24 typedef Vector<3, double>
Point3d;
25 typedef Matrix<3, 3, double>
Matrix3d;
29 gsl_matrix* mat = gsl_matrix_alloc(3, 3);
30 gsl_vector* eval = gsl_vector_alloc(3);
31 gsl_matrix* evec = gsl_matrix_alloc(3, 3);
32 gsl_eigen_symmv_workspace* w = gsl_eigen_symmv_alloc(3);
35 for(
int i = 0; i < 3; ++i)
36 for(
int j = 0; j < 3; ++j)
37 gsl_matrix_set(mat, i, j, M[i][j]);
39 gsl_eigen_symmv(mat, eval, evec, w);
40 gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_VAL_DESC);
42 p1 =
Point3d(gsl_matrix_get(evec, 0, 0), gsl_matrix_get(evec, 1, 0), gsl_matrix_get(evec, 2, 0));
43 p2 =
Point3d(gsl_matrix_get(evec, 0, 1), gsl_matrix_get(evec, 1, 1), gsl_matrix_get(evec, 2, 1));
44 p3 =
Point3d(gsl_matrix_get(evec, 0, 2), gsl_matrix_get(evec, 1, 2), gsl_matrix_get(evec, 2, 2));
45 ev =
Point3d(gsl_vector_get(eval, 0), gsl_vector_get(eval, 1), gsl_vector_get(eval, 2));
53 mat[i][j] = p1[i]*p2[j];
86 return (!((*
this) == other));