使用EIGEN库填充动态矢量

时间:2017-01-26 07:44:49

标签: c++ vector eigen

我必须使用EIGEN在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;
}

我可以编译它,但是当我运行该程序时,我收到此错误:

  

dynamic:/usr/include/Eigen/src/Core/DenseCoeffsBase.h:425:Eigen :: DenseCoeffsBase :: Scalar&amp; Eigen :: DenseCoeffsBase :: operator()(Eigen :: Index)[with Derived = Eigen :: Matrix; Eigen :: DenseCoeffsBase :: Scalar = double; Eigen :: Index = int]:断言`index&gt; = 0&amp;&amp;指数&lt; size()'失败了。   Abgebrochen

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

谢谢!

编辑:对于我的应用程序,我不知道编译时矢量的大小。我想知道是否有类似于vector::push_back的类似方法。

2 个答案:

答案 0 :(得分:4)

你忘了为矢量预留空间。对于std::vector,这是相同的。

试试这个

#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';
}

答案 1 :(得分:0)

@Maikel建议我。我可以用resize函数解决我的问题,如下所示;

#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函数可以找到:

  

&#34;如果实际矩阵大小没有改变,则resize()方法是无操作的;否则它是破坏性的:系数的值可能会改变。如果你想要一个不改变系数的保守变量resize(),请使用conservativeResize()&#34;

因此,当使用conservativeResize()确保值不会丢失时更好。