diff --git a/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h b/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h index 2f302dbae..02174b0d2 100644 --- a/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +++ b/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h @@ -583,19 +583,19 @@ template struct direct_selfadjoint_eigenvalues(); MatrixType tmp; tmp = scaledMat; - tmp.diagonal().array () -= eivals (2); - eivecs.col (2) = tmp.row (0).cross (tmp.row (1)).normalized (); + tmp.diagonal().array () -= eivals(2); + eivecs.col(2) = tmp.row(0).cross(tmp.row(1)).normalized(); tmp = scaledMat; - tmp.diagonal ().array () -= eivals (1); - eivecs.col(1) = tmp.row (0).cross(tmp.row (1)); + tmp.diagonal().array() -= eivals(1); + eivecs.col(1) = tmp.row(0).cross(tmp.row(1)); Scalar n1 = eivecs.col(1).norm(); if(n1<=Eigen::NumTraits::epsilon()) eivecs.col(1) = eivecs.col(2).unitOrthogonal(); else eivecs.col(1) /= n1; - // make sure that evecs[1] is orthogonal to evecs[2] + // make sure that eivecs[1] is orthogonal to eivecs[2] eivecs.col(1) = eivecs.col(2).cross(eivecs.col(1).cross(eivecs.col(2))).normalized(); eivecs.col(0) = eivecs.col(2).cross(eivecs.col(1)); } @@ -617,6 +617,15 @@ template struct direct_selfadjoint_eigenvalues struct direct_selfadjoint_eigenvalues 0) + scaledMat.diagonal().array () -= eivals(1); + Scalar a2 = abs2(scaledMat(0,0)); + Scalar c2 = abs2(scaledMat(1,1)); + Scalar b2 = abs2(scaledMat(1,0)); + if(a2>c2) { - Scalar len(1.0); - if (-yy+xx+root != Scalar(0.0)) - { - ny = -Scalar(2.0)*xy/(-yy+xx+root); - len = Scalar(1.0)/sqrt(1+ny*ny); - ny *= len; - } - else - ny = Scalar(0.0); - nx = -len; + eivecs.col(1) << -scaledMat(1,0), scaledMat(0,0); + eivecs.col(1) /= sqrt(a2+b2); } else { - Scalar len = Scalar(1.0); - if (-yy+xx-root != Scalar(0.0)) - { - nx = -Scalar(2.0)*xy/(-yy+xx-root); - len = Scalar(1.0)/sqrt(1+nx*nx); - nx *= len; - } - else - nx = Scalar(0.0); - ny = len; + eivecs.col(1) << -scaledMat(1,1), scaledMat(1,0); + eivecs.col(1) /= sqrt(c2+b2); } - - int id0(0), id1(1); - if(eig_val1>eig_val2) - std::swap(id0,id1); - eivecs.col(id0) << nx, ny; - eivecs.col(id1) << -ny, nx; - eivals(id0) = eig_val1; - eivals(id1) = eig_val2; + eivecs.col(0) << eivecs.col(1).unitOrthogonal(); } // Rescale back to the original size.