/// 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;
}
Example #2
0
void EigenValues(const SymmetricMatrix& X, DiagonalMatrix& D,
   SymmetricMatrix& A)
{ DiagonalMatrix E; tred3(X,D,E,A); tql1(D,E); }