gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:39:36 32 4
gpt4 key购买 nike

我有以下简单示例来执行最小二乘法,但出现以下断言错误。

Assertion failed: (i>=0) && ( ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && 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());

最佳答案

正如我在评论中所说,问题在于 x是一个抽象表达式,存储对 QR 对象的引用,但在最后一行之后它将引用一个死对象,然后任何事情都可能发生!

更准确地说,A.matrix().colPivHouseholderQr()创建一个临时对象,我们称它为tmp_qr .然后 tmp_qr.solve(B)创建另一个对象成为 x类型 Solve<...> .该对象实质上存储了两个引用:一个指向 tmp_qr。 , 和一个到 B .在这一行之后,临时对象 tmp_qr被删除,所以 Solve<...>对象 x有一个死引用。它就像一个指向已删除缓冲区的指针。最后,如果你x稍后,例如:

VectorXd y = x;

operator=将使用 x 引用的 QR 分解触发求解操作和右侧Bx 引用也是,但是,等等……QR 分解对象已被删除,所以充其量你会得到一个段错误。

所以解决方案是这样写:

VectorXd x = A.matrix().colPivHouseholderQr().solve(B.matrix());

参见 Eigen 的 doc有关如何 auto 的更多详细信息如果你不知道你得到了什么,那是很危险的。

关于c++ - 用特征值求解最小二乘方程的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47800872/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com