【问题标题】:Copy an Eigen vector to a C array?将特征向量复制到 C 数组?
【发布时间】:2017-10-18 17:25:29
【问题描述】:

如何将特征向量 mesh 复制到 C 数组 r

double *r;
typedef Eigen::VectorXd RealVector;
Eigen::Map<RealVector>(r, 1, mesh.cols()) = mesh;

从 Eigen 给出一个断言

DenseBase::resize() does not actually allow to resize.

同样的消息来自任何一方

Eigen::Map<RealVector>(r, mesh.cols()) = mesh;

Eigen::Map<RealVector>(r, mesh.cols(), 1) = mesh;

我需要复制这些值,而不仅仅是映射。

【问题讨论】:

  • 根据this answer,需要自己为r分配空间。
  • 我确实为r分配了空间;只是没有在代码中显示那部分。但如果我不这样做,我会得到一个不同的错误,例如访问冲突。
  • mesh 的大小是多少? IE。它只有 1 行吗?

标签: c++ arrays vector eigen


【解决方案1】:

您实际上不必复制任何内容。您可以使用.data() 成员函数访问原始数据。

#include <Eigen/Core>

int main()
{
  Eigen::VectorXd mesh = Eigen::VectorXd::Random(10);
  double * r = mesh.data();

  r[5] = 0; // writes to mesh directly
  assert(mesh(5) == 0);
}

如果要将数据复制到指针,则必须分配内存,执行复制并在使用后释放。

#include <algorithm>
#include <Eigen/Core>

int main()
{
  Eigen::VectorXd mesh = Eigen::VectorXd::Random(10);
  double * r = new double[mesh.size()];

  std::copy(mesh.data(), mesh.data() + mesh.size(), r);
  assert(r[5] == mesh(5));

  delete[] r;
}

【讨论】:

  • Tnx 获取信息。正如我在原始帖子中所说,我需要在单独的内存中复制一份数据(我已分配,但未在我的代码中显示)。而且,正如 chtz 建议的那样,Eigen::Map&lt;RealVector&gt;(r, mesh.rows()) = mesh 按我的意愿工作。
【解决方案2】:

由于您没有澄清,我推测您可能犯了三个可能的错误:

  • 你的mesh实际上是VectorXd,但它总是只有一列,但可能有多行,即你需要写:

    Eigen::VectorXd::Map(r, mesh.rows()) = mesh;
    
  • 或者您的meshRowVectorXd(即,有一行和多列)。然后你需要写:

    Eigen::RowVectorXd::Map(r, mesh.cols()) = mesh;
    
  • 如果mesh 实际上是一个矩阵,您需要决定如何将其映射到线性内存(即行优先或列优先)。 Map 也可以做到这一点:

    Eigen::MatrixXd::Map(r, mesh.rows(), mesh.cols()) = mesh;
    

【讨论】:

  • Tnx 供您详细分析。这是调试器为mesh 显示的内容: Eigen::Matrix - Eigen::PlainObjectBase<:matrix> > {m_storage m_rows=500 } } 。它确实是 VectorXd,但我切换了行和列。 Eigen::Map&lt;RealVector&gt;(r, mesh.rows()) = mesh 工作。
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 2022-11-17
相关资源
最近更新 更多