Skip to content

Commit 44790b4

Browse files
authored
Merge pull request #5956 from mvieth/eigen33_eigenvector
Fix behaviour of eigen33 function if smallest eigenvalue is not unique
2 parents e5e7972 + be65ef7 commit 44790b4

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

common/include/pcl/common/impl/eigen.hpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,21 @@ eigen33 (const Matrix& mat, typename Matrix::Scalar& eigenvalue, Vector& eigenve
308308
computeRoots (scaledMat, eigenvalues);
309309

310310
eigenvalue = eigenvalues (0) * scale;
311-
312-
scaledMat.diagonal ().array () -= eigenvalues (0);
313-
314-
eigenvector = detail::getLargest3x3Eigenvector<Vector> (scaledMat).vector;
311+
if ( (eigenvalues (1) - eigenvalues (0)) > Eigen::NumTraits < Scalar > ::epsilon ()) {
312+
// usual case: first and second are not equal (so first and third are also not equal).
313+
// second and third could be equal, but that does not matter here
314+
scaledMat.diagonal ().array () -= eigenvalues (0);
315+
eigenvector = detail::getLargest3x3Eigenvector<Vector> (scaledMat).vector;
316+
}
317+
else if ( (eigenvalues (2) - eigenvalues (0)) > Eigen::NumTraits < Scalar > ::epsilon ()) {
318+
// first and second equal: choose any unit vector that is orthogonal to third eigenvector
319+
scaledMat.diagonal ().array () -= eigenvalues (2);
320+
eigenvector = detail::getLargest3x3Eigenvector<Vector> (scaledMat).vector.unitOrthogonal ();
321+
}
322+
else {
323+
// all three equal: just use an arbitrary unit vector
324+
eigenvector << Scalar (1.0), Scalar (0.0), Scalar (0.0);
325+
}
315326
}
316327

317328

0 commit comments

Comments
 (0)