为什么matlab的mldivide比dgels好这么多?

Why is matlab's mldivide so much better than dgels?

解决Ax = b。真正的双重。 A 是超定 Mx2,M >> 2。b 是 Mx1。我有 运行 大量针对 mldivide 的数据,结果非常好。我用 MKL LAPACKE_dgels 写了一个 mex 例程,它远没有那么好。结果有大量噪音,基本信号几乎不存在。我首先根据 MKL 示例结果检查了例程。我搜索了 mldivide 文档(流程图)和 SO 问题。我发现的只是 Matlab 对超定矩形使用 QR 因式分解。

接下来我应该尝试什么?我使用了错误的 LAPACK 例程吗?请帮助指导我正确的方向。

更新: 对于解向量上的 E-15 浮点差,Intel MKL LAPACKE_dgels 与 Matlab mldivide 对于真正的双重超定(矩形)问题具有相同的结果。据我所知,这是使用的QR方法。

注意从这个 dgels 返回的残差。它们不等于 b - Ax。他们中的许多人接近这个值,而有些则远离它。

问题不是解决方案 x,而是 DGELS 返回的残差。此例程的输出是在输入数组指针上就地修改的。 MKL doc 表示输入数组 b 被前 N 行的输出向量 x 覆盖,然后是 N+1 到 [=16= 中的残差].我用我的代码确认了这一点。

错误在于将 b[N+1] 残差与原始输入 b[1] 对齐,并据此做出进一步的算法决策。残差与原始输入的正确对齐方式是 b[1]b[1]。前 N 个残差不可用;你必须在之后计算这些。

文档并没有说它们本身就是残差,而是具体地说

the residual sum of squares for the solution in each column is given by the sum of squares of modulus of elements n+1 to m in that column.