【问题标题】:Fill dynamic vector using EIGEN library使用 EIGEN 库填充动态向量
【发布时间】:2017-06-11 15:36:15
【问题描述】:

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

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

动态:/usr/include/Eigen/src/Core/DenseCoeffsBase.h:425: Eigen::DenseCoeffsBase::Scalar& Eigen::DenseCoeffsBase::operator()(Eigen::Index) [with Derived = Eigen: :矩阵; Eigen::DenseCoeffsBase::Scalar = double; Eigen::Index = int]:断言 `index >= 0 && index

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

谢谢!

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

【问题讨论】:

  • 断言index &gt;= 0 &amp;&amp; index &lt; size() 失败。 您可以轻松使用std::vector 执行相同的越界访问。

标签: c++ vector eigen


【解决方案1】:

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

【讨论】:

  • 这就是问题所在,我不知道编译时向量的大小。使用 std::vector 我可以使用 push_back 方法做到这一点。有没有办法用 eigen 实现同样的效果?谢谢!
【解决方案2】:

正如@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函数可以参考:

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

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

【讨论】:

  • 我不确定resize 函数是否保证保留旧值。您是否无法确定运行时需要多少?
  • 你什么时候有向量大小的信息?你需要在一个循环中调整大小还是你可以在它之前做到这一点?循环调整大小通常效率低下。
  • 我知道循环前向量的大小,这很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-09-15
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多