将特征向量复制到C数组?

时间:2017-05-18 18:37:07

标签: c++ arrays vector eigen

如何将特征向量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;

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

2 个答案:

答案 0 :(得分: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;
    

答案 1 :(得分:0)

您不必实际复制任何内容。您可以使用.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;
}