求解 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< 中的残差
到 M
。我用我的代码确认了这一点。
错误在于将 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
tom
in that column.
关于matlab - 为什么matlab的mldivide比dgels好这么多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58171528/