C++ 用特征值解最小二乘方程的正确方法是什么?

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;

我有下面的简单示例来执行最小二乘法,但得到了以下断言错误

断言失败:(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;
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
of
x
是存储引用的
Solve
抽象表达式。。。。