提问者:小点点

利用特征库填充动态向量


我必须用for循环中的值填充向量,使用本征。我在尝试类似的东西。。。

#include <iostream> 
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;

int main(){ 
  VectorXd s;
  for (int i=0,i<10;i++){
     s(i) = (double) i;
  }
return 0;
}

我可以编译它,但是当我运行这个程序时,我得到了这个错误:

动态:/usr/include/eigen/src/core/densecoeffsbase.h:425:eigen::densecoeffsbase::scalar&;Eigen::DenseCoeffsBase::Operator()(Eigen::Index)[with Derived=Eigen::Matrix;Eigen::DenseCoeffsBase::Scalar=Double;Eigen::Index=int]:断言索引&>0&&索引(<);“size()'失败。阿布盖布罗欣

我知道我可以使用std::vector类轻松实现这一点,但是我想用eigen来实现,因为之后我必须做很多矩阵运算。

谢谢!

编辑:对于我的应用程序,我在编译时不知道向量的大小。我想知道Eigen中是否存在类似的方法。


共2个答案

匿名用户

你忘了为矢量保留空间。这对于也是一样的。

试试这个

#include <Eigen/Dense>
#include <iostream>

int main()
{
  // resize to 10 elements
  auto vec = Eigen::VectorXd(10);
  for (int i = 0; i < vec.size(); ++i) {
    vec[i] = i;
  }
  std::cout << vec << '\n';
}

匿名用户

正如@maikel建议我的那样。我可以用调整大小函数解决我的问题,如下所示;

#include <iostream> 
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;

int main(){ 
  VectorXd s;
  for (int i=0,i<10;i++){
     s.resize(i+1);
     s(i) = (double) i;
  }
return 0;
} 

@Jonas让我意识到我知道循环前向量的大小,所以我可以在循环前调整一次大小。

可以在Eigen的文档中找到关于调整大小函数的信息:

“如果实际矩阵大小不变,则resize()方法为非运算;否则它是破坏性的:系数的值可能会改变。如果您希望resize()的保守变体不改变系数,请使用conservatieResize()。”

因此,使用conservativeResize()可以更好地确保值不会丢失。