无法访问特征线性系统解决方案的元素

时间:2016-03-04 00:40:31

标签: c++ eigen

我刚刚开始使用eigen,但由于一些奇怪的原因,我正在努力应对简单的事情。下面的代码是我想要执行的一些类似计算的简化版本(在Ax = b中求解x)。

输入:

auto N = 10;
auto A = Matrix<Float, Dynamic, Dynamic>::Identity(N, N);
auto b = Matrix<Float, Dynamic, 1>::Constant(N, 1, 1);
std::cout << "A: " << std::endl
          << A << std::endl
          << "b: " << std::endl 
          << b << std::endl;
auto x = A.fullPivLu().solve(b);
std::cout << "x(" << x.rows() << ", " << x.cols()
          << "): " << std::endl << x << std::endl;

输出:

A: 
1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1
b: 
1
1
1
1
1
1
1
1
1
1
x(10, 1): 
mouse: /home/jansen/devel/build/external/eigen/include/eigen3/Eigen/src/Core/Block.h:119: Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 1, -1, false>::Block(XprType &, Index) [XprType = Eigen::Matrix<double, -1, -1, 0, -1, -1>, BlockRows = 1, BlockCols = -1, InnerPanel = false]: Assertion `(i>=0) && ( ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && i<xpr.rows()) ||((BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) && i<xpr.cols()))' failed.
[1]    21192 abort (core dumped)  ./src/mouse

A和b形成良好,解x甚至具有正确的尺寸,但每当我尝试访问x的元素时,我得到断言失败。从断言我推断出某种出界错误发生但我无法弄清楚为什么?

1 个答案:

答案 0 :(得分:3)

请不要滥用auto表达式模板库,请参阅此page。通常,在您的情况下,x不是Matrix<>对象,而是一个抽象对象,表示要计算A\b ...因此解决方案是:

Matrix<Float, Dynamic, 1> x = A.fullPivLu().solve(b);