/// Fast 3x3 eigenvalue decomposition bool eig3(Matrix3x3 &m, Float lambda[3]) { Float subd[3]; /* Reduce to Hessenberg form */ tred3(m, lambda, subd); /* Iteratively find the eigenvalues and eigenvectors using implicitly shifted QL iterations */ if (!ql3(m, lambda, subd)) return false; /* Sort the eigenvalues in decreasing order */ for (int i=0; i<2; ++i) { /* Locate the maximum eigenvalue. */ int largest = i; Float maxValue = lambda[largest]; for (int j = i+1; j<3; ++j) { if (lambda[j] > maxValue) { largest = j; maxValue = lambda[largest]; } } if (largest != i) { // Swap the eigenvalues. std::swap(lambda[i], lambda[largest]); // Swap the eigenvectors for (int j=0; j<3; ++j) std::swap(m(j, i), m(j, largest)); } } return true; }
void EigenValues(const SymmetricMatrix& X, DiagonalMatrix& D, SymmetricMatrix& A) { DiagonalMatrix E; tred3(X,D,E,A); tql1(D,E); }