我试图在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中的一个错误,还是我错过了解文档中的内容?
答案 0 :(得分:5)
您遇到了别名问题:v
在v.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总结了一些常见的别名陷阱(它还提到了你经历的调整大小的别名)。