C++ 用特征值解最小二乘方程的正确方法是什么?
我有下面的简单示例来执行最小二乘法,但得到了以下断言错误 断言失败:(i>=0)和((BlockRows==1)&& (BlockCols==XprType::colsatcomiletime)和&i 正确的方法是什么C++ 用特征值解最小二乘方程的正确方法是什么?,c++,eigen,C++,Eigen,我有下面的简单示例来执行最小二乘法,但得到了以下断言错误 断言失败:(i>=0)和((BlockRows==1)&& (BlockCols==XprType::colsatcomiletime)和&i 正确的方法是什么 typedef Eigen::ArrayXd arr; typedef Eigen::ArrayXXd arr2; arr2 A(3, 3); arr B(3); A << 1, 0, 0, 0, 1, 0, 0, 0, 1; B << 1, 2, 3;
typedef Eigen::ArrayXd arr;
typedef Eigen::ArrayXXd arr2;
arr2 A(3, 3);
arr B(3);
A << 1, 0, 0, 0, 1, 0, 0, 0, 1;
B << 1, 2, 3;
auto x = A.matrix().colPivHouseholderQr().solve(B.matrix());
typedef特征::ArrayXd arr;
typedef本征::arrayxd arr2;
arr2a(3,3);
arrb(3);
A正如我在评论中所说,问题在于x
是一个抽象表达式,存储对QR对象的引用,但在最后一行之后,它将引用一个死对象,然后任何事情都可能发生
更准确地说,A.matrix().colPivHouseholderQr()
创建了一个临时对象,我们称之为tmp\u qr
。然后tmp\u qr.solve(B)
创建另一个对象,该对象将成为Solve
类型的x
。该对象基本上存储两个引用:一个指向tmp\u qr
,另一个指向B
。在这一行之后,临时对象tmp\u qr
被删除,因此Solve
对象x
有一个死引用。类似于引用已删除缓冲区的指针。最后,如果您稍后x
,如:
VectorXd y = x;
operator=
将使用x
引用的QR分解和x
引用的右侧B
触发解算操作,但是,等等……QR分解对象已被删除,因此最多只能得到一个segfault
因此,解决方案是写:
VectorXd x = A.matrix().colPivHouseholderQr().solve(B.matrix());
<> p>参见EGIN,关于<代码>自动<代码>是如何危险的,如果你不知道你得到了什么。 <代码> a打印出一个,它是身份矩阵。@ NikasrMy坏,看起来它像你所想的一样工作。认为C++语法会导致这里的行为不同。@ NIKLASR EGIN重载逗号运算符,以便它可以用于ssign values to a matrix.对我来说很有用,但你需要用VectorXd
替换auto
,否则x
将是一个抽象表达式,存储对QR分解的死引用。请看我读了文档,但仍然无法理解为什么auto会导致错误。你能详细说明一下吗?我编辑了我的答案,以全面解释问题开始一个。希望它现在清楚。如果没有,你可能需要阅读C/C++中的临时生存期。我理解你提到的死引用问题。我困惑的部分是为什么自动导致死引用,但VectorXd避免它。编译时不是自动解析为VectorXd吗?不,这就是问题所在,类型为auto x
ofx
是存储引用的Solve
抽象表达式。。。。