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

Joshua Cates cates at sci.utah.edu
Thu Apr 7 12:53:38 EDT 2005


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
> 	>      
> 	>
> 	
> 	
> 
> 

-- 
______________________________
 Josh Cates			
 Scientific Computing and Imaging Institute
 University of Utah
 http://www.sci.utah.edu/~cates




More information about the Insight-users mailing list