c++ - Eigen 等价于矩形矩阵的 Octave/MATLAB mldivide

标签 c++ matlab octave linear-algebra eigen

我正在使用 Eigen v3.2.7。

我有一个中等大小的矩形矩阵 X (170x17) 和行 vector Y (170x1),我正在尝试使用 Eigen 求解它们。 Octave 使用 X\Y 很好地解决了这个问题,但是 Eigen 为这些矩阵返回了不正确的值(但不是更小的)——但是我怀疑这就是我使用 Eigen 的方式,而不是 Eigen 本身。

auto X = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>{170, 17};
auto Y = Eigen::Matrix<T, Eigen::Dynamic, 1>{170};

// Assign their values...

const auto theta = X.colPivHouseholderQr().solve(Y).eval(); // Wrong!

根据 Eigen documentationColPivHouseholderQR 求解器适用于一般矩阵并且非常稳健,但为了确保我也尝试了 FullPivHouseholderQR。结果是一样的。

Octave 的 mldivide 是否有一些我需要为 Eigen 手动实现的特殊魔法?

更新

This spreadsheet有两个输入矩阵,加上 Octave 和我的结果矩阵。

替换 auto 没有什么不同,我也不希望它有什么不同,因为构造不能是惰性操作,我必须调用 .eval()求解结果,因为我对结果矩阵所做的下一件事是在尾部和头部操作中获取原始数据(使用 .data())。这些 block 操作结果的表达式模板版本没有 .data() 成员,所以我必须事先强制评估 - 换句话说 theta 是具体的已经输入,不是表达式模板。

(X*theta-Y).norm()/Y.norm() 的结果是:

2.5365e-007

(X.transpose()*X*theta-X.transpose()*Y).norm()/(X.transpose()*Y).norm() 的结果> 是:

2.80096e-007

由于我目前对我的基本数字类型使用单精度 float ,因此两者几乎都是零。

最佳答案

根据您的验证,您得到的解决方案是完美的。如果您想要更高的准确性,请使用 double float 。请注意,MatLab/Octave 默认使用 double 。

此外,您的问题也可能不是满秩的,在这种情况下,您的问题有无限多的解。 ColPivHouseholderQR 任意选择一个。另一方面,mldivide 将选择您也可以使用 Eigen::BDCSVD(Eigen 3.3)或较慢的 Eigen::JacobiSVD 获得的最小范数。

关于c++ - Eigen 等价于矩形矩阵的 Octave/MATLAB mldivide,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35189394/

相关文章:

c++ - 如何使用 Visual Studio 2008 构建在普通旧 XP SP2 上运行且没有并排 DLL 的 C++ 应用程序?

c++ - 使用抽象返回类型设计继承

matlab - 如何将matlab矢量转换为3D矩阵

c++ - 如何使用 Eigen 3 表达 "<array-of-true-or-false> = <array> <= <scalar>"?

java - 如何使用 Homebrew 软件在 OS X 上使用 Java 安装 Octave?

matlab - Matlab(或 Octave)中 meshgrid 的矢量化

c++ - 编译器会排除未使用的模板代码吗?

c++ - Windows 中使用 IP Helper 的事件 UDP 连接的远程地址

matlab - 在 MATLAB 中,如何更改子图的背景颜色?

machine-learning - 梯度下降和正态方程为多元线性回归提供不同的 theta 值。为什么?