为什么Matlab的mldivide比dgels好得多?

时间:2019-09-30 16:06:53

标签: matlab linear-algebra lapack intel-mkl

解决Ax = b。真正的双重。 A被超定为Mx2,且M >> 2。b是Mx1。我已经针对mldivide运行了大量数据,结果非常好。我用MKL LAPACKE_dgels编写了一个mex例程,它差得远。结果会产生大量噪声,而基本信号几乎不存在。我首先对照MKL示例结果检查了例程。我已经搜索了mldivide文档(流程图)和SO问题。我发现的是Matlab使用QR分解处理超定矩形。

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

  

每列中解决方案的剩余平方和由该列中元素Nn+1的模量平方和得出。