我正在使用 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 documentation ,ColPivHouseholderQR
求解器适用于一般矩阵并且非常稳健,但为了确保我也尝试了 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/