Собственная библиотека, Якоби СВД - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь оценить трехмерную матрицу вращения между двумя наборами точек, и я хочу сделать это путем вычисления SVD ковариационной матрицы, скажем C, следующим образом:

U,S,V = svd(C)
R = V * U^T

C в моем случае это 3x3.Для этого я использую модуль JacobiSVD от Eigen, и только недавно обнаружил, что он хранит матрицы в мажорном столбце.Так что это меня запутало.

Так что, при использовании Eigen, я должен делать: V*U.transpose() или V.transpose()*U?

Кроме того, вращение является точным вплоть до изменения знака столбцаU соответствует наименьшему сингулярному значению, так что определитель R положителен.Допустим, индекс наименьшего единственного значения равен minIndex.

Поэтому, когда определитель отрицательный из-за путаницы в столбце, я должен сделать:

U.col(minIndex) *= -1 or U.row(minIndex) *= -1

Спасибо!

1 Ответ

2 голосов
/ 11 марта 2019

Это не имеет ничего общего с тем, что матрицы хранятся в мажорных строках или мажорных столбцах. svd(C) дает вам:

U * S.asDiagonal() * V.transpose() == C

, поэтому ближайший поворот R к C:

R = U * V.transpose();

Если вы хотите применить R к точке p (хранится как вектор-столбец), тогда вы делаете:

q = R * p;

Теперь, если вы заинтересованы R или его обратное R.transpose()==V.transpose()*U зависит от вас.

Единственные значения масштабируют столбцы U, поэтому вы должны инвертировать столбцы, чтобы получить det(U)=1. Опять же, ничего общего с макетом хранилища.

...