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

Tys*_*mer 3 matlab linear-algebra lapack intel-mkl

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

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

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

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

Tys*_*mer 5

问题不在于解决方案x,而在于从DGELS. 此例程的输出是在输入数组指针上就地修改。所述MKL DOC表示输入数组b被重写与输出向量x的第一N行,则在残差N+1M。我用我的代码确认了这一点。

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

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

平方为每列中的溶液的残余总和由元件的模数的平方和给定n+1m该列中。