Summary: | umeyama sometimes returns a reflection | ||||||
---|---|---|---|---|---|---|---|
Product: | Eigen | Reporter: | Charles Karney <charles> | ||||
Component: | Geometry | Assignee: | Nobody <eigen.nobody> | ||||
Status: | RESOLVED FIXED | ||||||
Severity: | Unknown | CC: | gael.guennebaud, hauke.heibel, injx032, jacob.benoit.1 | ||||
Priority: | Normal | ||||||
Version: | 3.2 | ||||||
Hardware: | All | ||||||
OS: | All | ||||||
Whiteboard: | |||||||
Attachments: |
|
I had the same problem of an unexpected reflection. Searching for the cause I found this bug report with the attached patch which fixed the issue. You might be interested in bug 771 where I tried to do this fitting problem in a cleaner and more flexible manner. hm the original code is indeed very odd, and I agree with the proposed patch. (sorry for looking at it so lately). Since we are at it, I don't see the point of this vector S full of ones... I'll remove it too. https://bitbucket.org/eigen/eigen/commits/1a74ed5ce5aa/ Summary: Bug 774: fix a numerical issue producing unwanted reflections. -- GitLab Migration Automatic Message -- This bug has been migrated to gitlab.com's GitLab instance and has been closed from further activity. You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.com/libeigen/eigen/issues/774. |
Created attachment 445 [details] Patch to umeyama to address reflection bug The following code const int m = 3; const int n = 3; Matrix<double, m, n> x, y; x << 0, 1,-1, 0, 0, 0, 0, 0, 0; y << 0,-1, 1, 0, 0, 0, 0, 0, 0; Matrix<double, m+1, m+1> ta = umeyama(x, y, false); returns a matrix with a determinant of -1. Umeyama's paper doesn't properly explain how to deal with this case. Basically everywhere he says rank(AB^T) = m - 1, he means to say rank(AB^T) < m. The attached patch (against version 3.2.1) fixes this bug. Note that I don't look at the sign of determinant of sigma at all. This is too subject to errors.