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

标签 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 浮点差,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 to m in that column.

关于matlab - 为什么matlab的mldivide比dgels好这么多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58171528/

相关文章:

arrays - 是否可以使用索引数组对三维数组的二维进行索引?

audio - 在MATLAB中连续播放音高

algorithm - 何时使用 dsgesv 与 dgesv 来求解线性方程组

c++ - 求解系统(矩形全包 (RFP) 格式)

math - 高效的4x4矩阵逆(仿射变换)

macports - OSX Mavericks ATLAS 从源和 Macports 安装失败

Matlab, Simulink, Making connection between multiple simulink models via Lan

matlab 绘图图像作为图形的背景

python - Numpy:将矩阵与 3d 张量相乘——建议

c++ - 判断两条线是否相交