使用特征库填充动态向量

Fill dynamic vector using EIGEN library

本文关键字:动态 向量 填充 特征      更新时间:2023-10-16

我必须使用 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::D enseCoeffsBase::

Scalar& Eigen::D enseCoeffsBase::operator()(Eigen::Index) [with Derived = Eigen::Matrix;Eigen::D enseCoeffsBase::Scalar = double;Eigen::Index = int]:断言"index>= 0 && index

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

谢谢!

编辑:对于我的应用程序,我不知道编译时矢量的大小。我想找出是否有任何类似的方法,例如本征中的vector::push_back

您忘记为向量保留空间。这对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';
}
正如

@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

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

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

因此,最好使用 conservativeResize() 来确保值不会丢失。