我正在使用Eigen v3.2.7。
我有一个中等大小的矩形矩阵X
(170x17)和行向量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()
)。这些块操作的结果的表达式模板版本没有.data()
成员,因此我必须事先强制进行评估 - 换句话说,theta
已经是具体类型,而不是表达式模板。< / p>
(X*theta-Y).norm()/Y.norm()
的结果是:
2.5365e-007
(X.transpose()*X*theta-X.transpose()*Y).norm() / (X.transpose()*Y).norm()
的结果是:
2.80096e-007
由于我目前正在使用基本数字类型的单精度浮点数,因此两者都非常零。
答案 0 :(得分:1)
根据您的验证,您获得的解决方案非常好。如果您想要更高的准确性,请使用Eigen::BDCSVD
浮点数。请注意,MatLab / Octave默认使用双精度。
此外,也可能是您的问题不是满级,在这种情况下,您的问题会承认无限多的解决方案。 ColPivHouseholderQR选择一个,不知怎的任意。另一方面,mldivide将选择最小范数,你可以用Eigen::JacobiSVD
(Eigen 3.3)或慢<input id="datepicker1" type="text" class="form-control" style="z-index: 20">
来获得。