aboutsummaryrefslogtreecommitdiffhomepage
path: root/bench/eig33.cpp
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2011-02-03 11:25:34 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2011-02-03 11:25:34 +0100
commit1eae6d0fb9f433691d670cafa4f37ca43307a383 (patch)
tree8ca36282902882eeee93e914a94f1cb1d52a9613 /bench/eig33.cpp
parent5beb2f4f0d7b245853eb96a64f2367d91db056b9 (diff)
an even more stable procedure
Diffstat (limited to 'bench/eig33.cpp')
-rw-r--r--bench/eig33.cpp37
1 files changed, 24 insertions, 13 deletions
diff --git a/bench/eig33.cpp b/bench/eig33.cpp
index 4a2320ee1..9f9e1f8a9 100644
--- a/bench/eig33.cpp
+++ b/bench/eig33.cpp
@@ -153,20 +153,31 @@ void eigen33(const Matrix& mat, Matrix& evecs, Vector& evals)
// tmp.diagonal().array() -= evals(2);
// evecs.col(2) = tmp.row(0).cross(tmp.row(1)).normalized();
- // a slighlty more stable version:
- Matrix tmp;
- tmp = scaledMat;
- tmp.diagonal ().array () -= evals (2);
- evecs.col (2) = tmp.row (0).cross (tmp.row (1)).normalized ();
- tmp = scaledMat;
- tmp.diagonal ().array () -= evals (1);
- evecs.col(1) = tmp.row (0).cross(tmp.row (1));
- Scalar n1 = evecs.col(1).norm();
- if(n1<=Eigen::NumTraits<Scalar>::epsilon())
- evecs.col(1) = evecs.col(2).unitOrthogonal();
+ // a more stable version:
+ if((evals(2)-evals(0))<=Eigen::NumTraits<Scalar>::epsilon())
+ {
+ evecs.setIdentity();
+ }
else
- evecs.col(1) /= n1;
- evecs.col(0) = evecs.col(2).cross(evecs.col(1));
+ {
+ Matrix tmp;
+ tmp = scaledMat;
+ tmp.diagonal ().array () -= evals (2);
+ evecs.col (2) = tmp.row (0).cross (tmp.row (1)).normalized ();
+
+ tmp = scaledMat;
+ tmp.diagonal ().array () -= evals (1);
+ evecs.col(1) = tmp.row (0).cross(tmp.row (1));
+ Scalar n1 = evecs.col(1).norm();
+ if(n1<=Eigen::NumTraits<Scalar>::epsilon())
+ evecs.col(1) = evecs.col(2).unitOrthogonal();
+ else
+ evecs.col(1) /= n1;
+
+ // make sure that evecs[1] is orthogonal to evecs[2]
+ evecs.col(1) = evecs.col(2).cross(evecs.col(1).cross(evecs.col(2))).normalized();
+ evecs.col(0) = evecs.col(2).cross(evecs.col(1));
+ }
// Rescale back to the original size.
evals *= scale;