aboutsummaryrefslogtreecommitdiffhomepage
path: root/bench/eig33.cpp
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2011-02-03 10:31:45 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2011-02-03 10:31:45 +0100
commit5beb2f4f0d7b245853eb96a64f2367d91db056b9 (patch)
treec99a33c31cb83200c3b05d6e3ad72848c7e155b4 /bench/eig33.cpp
parenta617d7f2adaa97fc0435ccae7954bcd9840b8857 (diff)
slightly more stable eigen vector computation
Diffstat (limited to 'bench/eig33.cpp')
-rw-r--r--bench/eig33.cpp35
1 files changed, 25 insertions, 10 deletions
diff --git a/bench/eig33.cpp b/bench/eig33.cpp
index da8518012..4a2320ee1 100644
--- a/bench/eig33.cpp
+++ b/bench/eig33.cpp
@@ -139,19 +139,34 @@ void eigen33(const Matrix& mat, Matrix& evecs, Vector& evals)
// }
// evecs.col(2) = evecs.col(0).cross(evecs.col(1)).normalized();
- // naive version
+// // naive version
+// Matrix tmp;
+// tmp = scaledMat;
+// tmp.diagonal().array() -= evals(0);
+// evecs.col(0) = 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)).normalized();
+//
+// tmp = scaledMat;
+// 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(0);
- evecs.col(0) = 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)).normalized();
-
+ tmp.diagonal ().array () -= evals (2);
+ evecs.col (2) = tmp.row (0).cross (tmp.row (1)).normalized ();
tmp = scaledMat;
- tmp.diagonal().array() -= evals(2);
- evecs.col(2) = tmp.row(0).cross(tmp.row(1)).normalized();
+ 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;
+ evecs.col(0) = evecs.col(2).cross(evecs.col(1));
// Rescale back to the original size.
evals *= scale;