[vtkusers] Jacobi eigenvectors incorrect?

Bryn Lloyd blloyd at vision.ee.ethz.ch
Tue Oct 27 04:18:00 EDT 2009


Hi David,

I agree. The result is different to what I get in Matlab for a different 
matrix. vtkMath::JacobiN returns the same result as vtkMath::Jacobi.


My test programm:




#include <vtkMath.h>


template<class TReal>
TReal **create_matrix(long nrow, long ncol) {
   typedef TReal* TRealPointer;
   TReal **m = new TRealPointer[nrow];

   TReal* block = (TReal*)calloc(nrow*ncol, sizeof(TReal));
   m[0] = block;
   for ( int row = 1; row < nrow; ++row ) {
     m[ row ] = &block[ row * ncol ];
   }
   return m;
}
/* free a TReal matrix allocated with matrix() */
template<class TReal>
void free_matrix(TReal **m) {
   free (m[0]);
   delete[] m;
}


int main(int argc, char ** argv)
{
   // Matrix
   // 1  3  2
   // 1 -2  3
   // 1  2 -3

   double **a = create_matrix<double>(3,3);
   a[0][0] = 1; a[0][1] = 3;  a[0][2] = 2;
   a[1][0] = 1; a[1][1] = -2; a[1][2] = 3;
   a[2][0] = 1; a[2][1] = 2;  a[2][2] = -3;

   double **w = create_matrix<double>(3,3);
   double v[3];

   printf("Jacobi\n");
   vtkMath::Jacobi(a,v,w);
   for(int i=0; i<3; i++)
     printf("%g \t%g %g %g\n",v[i],w[i][0],w[i][1],w[i][2]);


   a[0][0] = 1; a[0][1] = 3;  a[0][2] = 2;
   a[1][0] = 1; a[1][1] = -2; a[1][2] = 3;
   a[2][0] = 1; a[2][1] = 2;  a[2][2] = -3;

   printf("\nJacobiN\n");
   vtkMath::JacobiN(a,3,v,w);
   for(int i=0; i<3; i++)
     printf("%g \t%g %g %g\n",v[i],w[i][0],w[i][1],w[i][2]);

/*
Output from this program:
Jacobi
4.369           0.729826 -0.677467 0.0916155
-2.78956        0.540772 0.490118 -0.68363
-5.57944        0.418234 0.548474 0.724056

JacobiN
4.369           0.729826 -0.677467 0.0916155
-2.78956        0.540772 0.490118 -0.68363
-5.57944        0.418234 0.548474 0.724056
*/


/*
% Matlab result:

a = [[1,3,2];[1,-2,3];[1,2,-3]];
[v,w] = eig(a)

v =

     0.8924    0.7816    0.1413
     0.3570   -0.5541   -0.7279
     0.2761   -0.2864    0.6709


w =

     2.8190         0         0
          0   -1.8598         0
          0         0   -4.9593
*/
   return 0;
}






More information about the vtkusers mailing list