我有 2 组带有 N 个条目的 3D 矢量。我正在尝试计算最能将第一组与第二组对齐的旋转矩阵。
我相信我可以使用 Java 库 JAMA 通过奇异值分解或特征值分解来完成此任务。
1) SVD 或 EVD 是正确的算法吗?
2) JAMA 中的 SVD/EVD 需要一个矩阵。如何根据我的两组向量填充矩阵?
我有 2 组带有 N 个条目的 3D 矢量。我正在尝试计算最能将第一组与第二组对齐的旋转矩阵。
我相信我可以使用 Java 库 JAMA 通过奇异值分解或特征值分解来完成此任务。
1) SVD 或 EVD 是正确的算法吗?
2) JAMA 中的 SVD/EVD 需要一个矩阵。如何根据我的两组向量填充矩阵?
这是我相信您所描述的内容的 2-D 版本(将其转换为 3-D 应该很简单,除了 m 矩阵将是 3x3 并且有
shftx/y/z
条目)。
点 (x, y) 到点 (u, v) 的仿射变换可以写为:
u m11 m12 x shftx
= * +
v m21 m22 y shfty
You can rewrite this as:
x y 0 0 1 0 m11 u
* =
0 0 x y 0 1 m12 v
m21
m22
shftx
shfty
这样做的原因是您使左侧的矩阵(具有 x/y/0/1 值)具有与数据集中的点一样多的行。如果你称这个矩阵 X 和右边的列向量为 U,那么问题就变成了找到方程 X * m = U 的最小二乘解 m。你可以通过 (new QRDecomposition(X)).solve(U)
. 我应该说在至少有一个版本的 QRDecomposition 代码中有一个错误,它假设解决方案矩阵的维度错误,但我通过更改 solve() 方法中的一行来修复它。