Orfeo Toolbox  3.16
itkSymmetricEigenSystem.txx
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Insight Segmentation & Registration Toolkit
4  Module: $RCSfile: itkSymmetricEigenSystem.txx,v $
5  Language: C++
6  Date: $Date: 2007-03-22 21:39:38 $
7  Version: $Revision: 1.8 $
8 
9  Copyright (c) Insight Software Consortium. All rights reserved.
10  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
11 
12  This software is distributed WITHOUT ANY WARRANTY; without even
13  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14  PURPOSE. See the above copyright notices for more information.
15 
16 =========================================================================*/
17 #ifndef __itkSymmetricEigenSystem_txx
18 #define __itkSymmetricEigenSystem_txx
19 
21 
22 namespace itk
23 {
24 
28 template< class TMatrixElement, int VNumberOfRows >
31 {
32  m_Matrix = 0;
33  m_UseAbsoluteOrder = true;
34  m_EigenValues.Fill( NumericTraits< TMatrixElement >::Zero );
35  ArrayType temp;
36  temp.Fill( NumericTraits< TMatrixElement >::Zero );
37  m_EigenVectors.Fill(temp);
38 }
39 
43 template< class TMatrixElement, int VNumberOfRows >
46 {
47 }
48 
49 template< class TMatrixElement, int VNumberOfRows >
50 void
52 ::PrintSelf(std::ostream& os, Indent indent) const
53 {
54  Superclass::PrintSelf(os, indent);
55 
56  os << indent << "Matrix:";
57 
58  if ( m_Matrix != 0 )
59  {
60  os << m_Matrix << std::endl;
61  }
62  else
63  {
64  os << "not set." << std::endl;
65  }
66 
67  os << indent << "Eigen Vectors " << m_EigenVectors << std::endl;
68  os << indent << "Eigen Values " << m_EigenValues << std::endl;
69  os << indent << "Absolute order " << m_UseAbsoluteOrder << std::endl;
70 }
71 
72 
76 template< class TMatrixElement, int VNumberOfRows >
77 void
80 {
81  int i, j, k;
82 
83  InternalEigenSystemType internalEigenSystem(m_Matrix->GetVnlMatrix());
84 
85  typedef vnl_vector< TMatrixElement > EigenVectorType;
86  EigenVectorType tempVector;
87 
88  for (i = 0; i < VNumberOfRows; i++)
89  {
90  tempVector = internalEigenSystem.get_eigenvector(i);
91  m_EigenValues[i] = internalEigenSystem.get_eigenvalue(i);
92  for (j = 0; j < VNumberOfRows; j++)
93  {
94  m_EigenVectors[i][j] = tempVector[j];
95  }
96  }
97 
98  double temp;
99  for(i = 0; i < (VNumberOfRows - 1); i++)
100  {
101  for(j = i + 1; j < VNumberOfRows; j++)
102  {
103  if( (m_EigenValues[j] > m_EigenValues[i] && !m_UseAbsoluteOrder) ||
104  ( (vnl_math_abs( m_EigenValues[j] ) > vnl_math_abs( m_EigenValues[i] ) )
105  && m_UseAbsoluteOrder) )
106  {
107  temp= m_EigenValues[i];
108  m_EigenValues[i] = m_EigenValues[j];
109  m_EigenValues[j] = temp;
110  for ( k = 0; k < VNumberOfRows; k++ )
111  {
112  temp = m_EigenVectors[i][k];
113  m_EigenVectors[i][k] = m_EigenVectors[j][k];
114  m_EigenVectors[j][k] = temp;
115  }
116  }
117  }
118  }
119 }
120 
121 } // end namespace itk
122 
123 #endif

Generated at Sun Feb 3 2013 00:09:24 for Orfeo Toolbox with doxygen 1.8.1.1