Eigen VectorXd数组右移操作结果异常,求问题原因
Eigen向量右移操作出现重复值的问题解决
你的代码核心问题是Eigen对重叠内存区域的默认赋值行为导致的覆盖问题。
当执行_x(seq(1, N - 1)) = _x(seq(0, N - 2));时,左右两个切片的内存是重叠的(左边的第i个元素对应右边的第i-1个元素)。Eigen默认会按顺序逐元素赋值:先把右边位置0的值赋给左边位置1,接着用已经被修改过的左边位置1的值(也就是原来的位置0的值)去赋给左边位置2,以此类推,最终就出现了相邻元素重复的结果。
修复方案
有三种简单的方式可以解决这个问题:
使用
eval()生成临时对象
让Eigen先把右边的切片内容复制到临时变量中,再赋值给左边,避免直接操作重叠内存:_x(seq(1, N - 1)) = _x(seq(0, N - 2)).eval();用
head()/tail()简化写法+eval()
利用Eigen提供的head(取前n个元素)和tail(取后n个元素)方法,代码更简洁:_x.tail(N-1) = _x.head(N-1).eval();手动创建临时变量
最直观的方式,先把需要复制的内容存到临时向量中,再赋值:vec temp = _x(seq(0, N - 2)); _x(seq(1, N - 1)) = temp;
修复后效果
修改后的代码执行循环后,最终_x的结果会是[9,8,7,6,5,4,3,2,1,0],符合你预期的“右移后在位置0插入新样本”的需求。
内容的提问来源于stack exchange,提问作者Buzz
相关产品推荐
相关产品推荐

