[Insight-users] calculating eigen values and vector of matrix

Leila baghdadi baghdadi at sickkids.ca
Thu Apr 7 13:43:13 EDT 2005


Hi Josh and Jim,

Thanks very much both of you for helping me out, that saves a lot of
hours,

my matrices are 4x4 and because I am implementing this as part of
surface registration in model-based segmentation (i.e, deformable
models), I am a bit concerned about the speed issue that Josh mentioned,
(i.e, there are a fair number of eigen values and vectors which need to
be calculated)

any comments


Leila

On Thu, 2005-04-07 at 12:53, Joshua Cates wrote:
> Hi Leila,
> 
> You can find some additional examples of using vnl_eigensystem in
> itkVectorGradientMagnitudeImageFilter.txx/.h.  Note that for 3x3 real
> symmetric matrices I chose to code my own solver since the vnl_eigensystem
> routines are not thread safe and pretty generic (i.e. slow).
> 
> Josh.
> 
> 
> On Thu, 7 Apr 2005, Miller, James V (Research) wrote:
> 
> > Leila, 
> >  Here is an example of using the vnl routines.  The code a eigenvalue
> > decomposition of a matrix M and extracts the eigenvector corresponding
> > to the smallest eigenvalue.  I use the vnl_real_eigensystem to compute
> > the eigensystem for the real matrix M.  The results (eigenvalues and
> > eigenvectors) are always "returned" as complex numbers matrices of
> > complex numbers (eigenvalues stored in a vnl_diag_matrix).
> >  To start this process with an itk::Matrix, you should be able to just
> > the result of GetVnlMatrix() to the eigensolver.
> >  
> > #include <vnl/vnl_matrix.h>
> > #include <vnl/vnl_math.h>
> > #include <vnl/vnl_vector.h>
> > #include <vnl/algo/vnl_real_eigensystem.h>
> > 
> > {
> >   vnl_matrix<double> M(3, 3);
> >   vnl_vector<double> params;
> >   double lambda;
> > 
> >   M = .......;  // some matrix M
> >  
> >   // construct the eigenvector problem
> >   vnl_real_eigensystem eig(M);
> > 
> >   // extract eigenvector corresponding to the smallest positive real eigenvalue
> >   vnl_diag_matrix<vcl_complex<double> >::iterator it;
> >   vnl_diag_matrix<vcl_complex<double> >::iterator small_it = eig.D.end();
> >   double small = vcl_numeric_limits<double>::max();
> >   const double eigenvalue_zero_tol = 1.0e-11;
> >   
> >   for (it = eig.D.begin(); it != eig.D.end(); ++it)
> >     {
> >     if ((*it).real() > eigenvalue_zero_tol
> >         && vcl_fabs((*it).imag()) < eigenvalue_zero_tol
> >         && (*it).real() < small)
> >       {
> >       small_it = it;
> >       }
> >     }
> > 
> >   params.set_size( eig.V.rows() ); // destroys previous values
> >   for (i=0; i < eig.V.rows(); i++)
> >     {
> >     params(i) = eig.V(i, small_it - eig.D.begin()).real();
> >     }
> >   lambda = (*small_it).real();
> > }
> > 
> > 	-----Original Message----- 
> > 	From: Leila baghdadi [mailto:baghdadi at sickkids.ca] 
> > 	Sent: Wed 4/6/2005 4:44 PM 
> > 	To: Miller, James V (Research) 
> > 	Cc: 
> > 	Subject: RE: [Insight-users] calculating eigen values and vector of matrix
> > 	
> > 	
> > 
> > 	Hello Jim,
> > 	
> > 	I see what you mean but I am having difficulty using the vnl methods
> > 	from my class,
> > 	
> > 	can you please give me a simple example,
> > 	
> > 	
> > 	Thanks
> > 	
> > 	Leila
> > 	
> > 	On Wed, 2005-04-06 at 16:03, Miller, James V (Research) wrote:
> > 	> Leila,
> > 	> 
> > 	> You'll have to call GetVnlMatrix() on your itk::Matrix and pass that to a vnl routine. There are several vnl eigensystem methods to choose from depending on the structure of your matrix (real, symmetric, ...)
> > 	> 
> > 	> Jim
> > 	>
> > 	>       -----Original Message-----
> > 	>       From: insight-users-bounces at itk.org on behalf of Leila baghdadi
> > 	>       Sent: Wed 4/6/2005 3:52 PM
> > 	>       To: Insight-users at itk.org
> > 	>       Cc:
> > 	>       Subject: [Insight-users] calculating eigen values and vector of matrix
> > 	>      
> > 	>      
> > 	>
> > 	>       Hi everyone,
> > 	>      
> > 	>       I know that the vnl utilities should have methods for the above
> > 	>      
> > 	>       but can you just use itkMatrix,
> > 	>      
> > 	>       I do not see any public methods for calculating eigen values or vector
> > 	>      
> > 	>      
> > 	>       any hints
> > 	>      
> > 	>       thanks
> > 	>      
> > 	>       Leila
> > 	>      
> > 	>       _______________________________________________
> > 	>       Insight-users mailing list
> > 	>       Insight-users at itk.org
> > 	>       http://www.itk.org/mailman/listinfo/insight-users
> > 	>      
> > 	>
> > 	
> > 	
> > 
> > 



More information about the Insight-users mailing list