File: diagonalize_matrix.cpp

package info (click to toggle)
cgal 4.9-1
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 85,584 kB
  • sloc: cpp: 640,841; ansic: 140,696; sh: 708; fortran: 131; makefile: 114; python: 92
file content (51 lines) | stat: -rw-r--r-- 1,362 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>

#ifdef CGAL_EIGEN3_ENABLED
#include <CGAL/Eigen_diagonalize_traits.h>
#else
#include <CGAL/Diagonalize_traits.h>
#endif

typedef double FT;
typedef CGAL::cpp11::array<FT, 6> Eigen_matrix;
typedef CGAL::cpp11::array<FT, 3> Eigen_vector;
typedef CGAL::cpp11::array<FT, 9> Eigen_three_vectors;

// If Eigen is enabled, use it, otherwise fallback to the internal model
#ifdef CGAL_EIGEN3_ENABLED
typedef CGAL::Eigen_diagonalize_traits<FT, 3> Diagonalize_traits;
#else
typedef CGAL::Diagonalize_traits<FT, 3> Diagonalize_traits;
#endif

int main(void)
{
  Eigen_matrix covariance = {{ 0., 0., 0., 0., 0., 0. }};
  
  // Fill matrix with random numbers
  for (std::size_t i = 0; i < 6; ++ i)
    covariance[i] = rand ();

  Eigen_vector eigenvalues;
  Eigen_three_vectors eigenvectors;

  if (!(Diagonalize_traits::diagonalize_selfadjoint_covariance_matrix (covariance,
								       eigenvalues,
								       eigenvectors)))
    {
      std::cerr << "Error: cannot diagonalize matrix" << std::endl;
      return -1;
    }

  // Print result
  for (std::size_t i = 0; i < 3; ++ i)
    {
      std::cout << "Eigenvalue " << i+1 << " = " << eigenvalues[i] << std::endl
		<< "  with eigenvector [ ";
      for (std::size_t j = 0; j < 3; ++ j)
	std::cout << eigenvectors[3*i + j] << " ";
      std::cout << "]" << std::endl;
    }
  
  return 0;
}