使用 Eigen 和动态矩阵进行分解时出错
Error during decomposition with Eigen with dynamic matrices
我正在尝试 Eigen here 提供的示例,它似乎有效。但是,当我尝试更改矩阵类型以支持动态矩阵时,一切都会爆炸(下面的一切都与示例中的完全相同,但 matrix/vector 的类型除外):
#include <Eigen/Dense>
#include <iostream>
using Matrix2D = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor | Eigen::AutoAlign>;
using Vector = Eigen::Matrix<double, Eigen::Dynamic, 1>;
int main() {
Matrix2D A(3,3);
Vector b(3);
A << 1,2,3, 4,5,6, 7,8,10;
b << 3, 3, 4;
std::cout << "Here is the matrix A:\n" << A << std::endl;
std::cout << "Here is the vector b:\n" << b << std::endl;
auto x = A.colPivHouseholderQr().solve(b);
std::cout << "The solution is:\n" << x << std::endl;
return 0;
}
运行
期间的输出
Here is the matrix A:
1 2 3
4 5 6
7 8 10
Here is the vector b:
3
3
4
The solution is:
a.out: eigen33/Eigen/src/Core/Block.h:123: Eigen::Block<XprType, BlockRows, BlockCols, InnerPanel>::Block(XprType&, Eigen::Index) [with XprType = Eigen::Matrix<double, -1, 1>; int BlockRows = 1; int BlockCols = 1; bool InnerPanel = false; Eigen::Index = long int]: Assertion `(i>=0) && ( ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && i<xpr.rows()) ||((BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) && i<xpr.cols()))' failed.
./makeEigen.sh: line 6: 12045 Aborted (core dumped) ./a.out
这是否可行,如果可行,我做错了什么?
这是使用 auto
很危险的地方之一。
您链接的示例有:
Vector3f x = A.colPivHouseholderQr().solve(b);
^^^^^^^^
您有:
auto x = A.colPivHouseholderQr().solve(b);
^^^^^
在这种情况下,这是一个非常显着的差异,因为 solve()
的 return 类型不是 Vector3f
。这是一些中间的不可表达的类型——我们正在构建一个表达式模板以备后用。但是那个表达式模板保留了一堆中间引用,如果你不立即解析它们,它们就会悬空。
来自Eigen docs:
In short: do not use the auto
keywords with Eigen's expressions, unless you are 100% sure about what you are doing. In particular, do not use the auto keyword as a replacement for a Matrix<>
type.
我正在尝试 Eigen here 提供的示例,它似乎有效。但是,当我尝试更改矩阵类型以支持动态矩阵时,一切都会爆炸(下面的一切都与示例中的完全相同,但 matrix/vector 的类型除外):
#include <Eigen/Dense>
#include <iostream>
using Matrix2D = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor | Eigen::AutoAlign>;
using Vector = Eigen::Matrix<double, Eigen::Dynamic, 1>;
int main() {
Matrix2D A(3,3);
Vector b(3);
A << 1,2,3, 4,5,6, 7,8,10;
b << 3, 3, 4;
std::cout << "Here is the matrix A:\n" << A << std::endl;
std::cout << "Here is the vector b:\n" << b << std::endl;
auto x = A.colPivHouseholderQr().solve(b);
std::cout << "The solution is:\n" << x << std::endl;
return 0;
}
运行
期间的输出Here is the matrix A:
1 2 3
4 5 6
7 8 10
Here is the vector b:
3
3
4
The solution is:
a.out: eigen33/Eigen/src/Core/Block.h:123: Eigen::Block<XprType, BlockRows, BlockCols, InnerPanel>::Block(XprType&, Eigen::Index) [with XprType = Eigen::Matrix<double, -1, 1>; int BlockRows = 1; int BlockCols = 1; bool InnerPanel = false; Eigen::Index = long int]: Assertion `(i>=0) && ( ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && i<xpr.rows()) ||((BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) && i<xpr.cols()))' failed.
./makeEigen.sh: line 6: 12045 Aborted (core dumped) ./a.out
这是否可行,如果可行,我做错了什么?
这是使用 auto
很危险的地方之一。
您链接的示例有:
Vector3f x = A.colPivHouseholderQr().solve(b);
^^^^^^^^
您有:
auto x = A.colPivHouseholderQr().solve(b);
^^^^^
在这种情况下,这是一个非常显着的差异,因为 solve()
的 return 类型不是 Vector3f
。这是一些中间的不可表达的类型——我们正在构建一个表达式模板以备后用。但是那个表达式模板保留了一堆中间引用,如果你不立即解析它们,它们就会悬空。
来自Eigen docs:
In short: do not use the
auto
keywords with Eigen's expressions, unless you are 100% sure about what you are doing. In particular, do not use the auto keyword as a replacement for aMatrix<>
type.