非常非方阵的密集分解

计算科学 矩阵 C++ 本征
2021-12-16 23:33:50

我继承了使用此页面上显示Eigen::Matrix的代码解决问题的代码

(A.transpose() * A).ldlt().solve(A.transpose() * b)

这可行,但我的矩阵大小通常可以是表达式为我提供了一个包含 400 倍数据的巨大方阵,因此我怀疑求解器浪费了大量时间来处理这些额外数据。[200×5]AT.A

是否有一个“更好”的求解器可以避免创建方阵,或者可以通过“分而治之的策略”来解决这个问题,也许我可以解决 40 个 50x5 的问题,然后解决 40x5 的结果?

更新:有关更多信息,我的问题是在对立体图像进行视差检查后,我有一个点云,并且根据函数名称,它正在尝试检测路面。我们求解矩阵,然后使用计算出的系数去除每组点中的噪声。

尝试准确解决所有 2000 分似乎需要付出很大的努力,这也让我感到震惊。也许选择每 10 个点会给出大致相似的答案?

此外,5 行值类似于(IIRC,我离开我的电脑一周!)XYZX2Y2

最后,请注意,一个操作本身并不是那么低效,而是我有超过 300 组点,每帧总计超过 100,000 个点。

1个回答

正如其他人在评论中提到的,求解(所谓的最小范数解)可以在不使用 QR 分解它是这样工作的:ATAx=ATbATA

A=QR
其中具有是正方形和三角形的有趣属性。使用此信息,最小二乘系统等价于: 利用的属性, 因为是三角形的,很容易计算。使用 Eigen,您不必担心这些。QQTQ=IRATAx=ATb
RTQTQRx=RTQTb
QR
x=R1RTRTQTb=R1QTb
RR1

A.colPivHouseholderQr().solve(b)

这可能比明确地形成正规方程更准确。如果您需要更快的速度,英特尔 MKL 有一个 QR 求解器可以解决您的问题。然而,与使用 Eigen 相比,API 很糟糕。