特征:提取一个块错过了一些条目

时间:2017-05-24 08:47:57

标签: eigen

我试图在Eigen中取一个块:

Eigen::VectorXi v = Eigen::VectorXi::Zero(20);
v << 7, 10, 11, 14, 15, 16, 16, 1, 2, 3, 2, 3, 4, 5, 4, 5, 0, 0, 0, 0;
cout << "v = " << v << endl;
v = v.block(0, 0, 16, 1);
cout << "v = "<< v << endl;

奇怪的是,v中的前两个条目在获取块后将为零。

该程序的输出如下:

v =  7 # start original vector from here
10
11
14
15
16
16
 1
 2
 3
 2
 3
 4
 5
 4
 5
 0
 0
 0
 0
v =  0 # start block out of vector, why zero here?
 0
11
14
15
16
16
 1
 2
 3
 2
 3
 4
 5
 4
 5

这里出了什么问题? 这可能是Eigen中的一个错误,还是我错过了解文档中的内容?

1 个答案:

答案 0 :(得分:5)

您遇到了别名问题:vv.block(...)被分配到新v之前会调整大小。有两种解决方案:

  • 使用.eval()

    评估临时值
    v = v.block(0,0,16,1).eval();  // or
    v = v.head(16).eval(); // shorter but equivalent
    
  • 或者,使用conservativeResize()(但只有在您想要保留左上角时才有效):

    v.conservativeResize(16);
    

进一步参考this page总结了一些常见的别名陷阱(它还提到了你经历的调整大小的别名)。