首页 > 解决方案 > 使用 Eigen::Map 构建矩阵时函数内部向量的内存分配

问题描述

我创建了一个读取向量并将结果复制到所需矩阵的类(实际上它将字符串更改为向量并且解析的向量的大小未知,但我发布了一个简化的代码)。

该函数getMatrix读取一个向量,将其复制到该向量中containerVector,并使用一个函数Map将其重塑为一个矩阵,containerMatrix通过引用传递。但是,在执行该函数后,该对象containerVector被销毁,据我所知 Eigen Map tutorialcontainerMatrix指向无处(或指向内存中的某个随机位置)。因此,当我执行第二个函数 setModelMatrix 时,它应该返回一些内存分配或分段错误错误。但是,它可以正常工作,因此看起来值是被复制的,而不是被传递的。以这种方式使用 Map 是否安全,还是我只是幸运?我的理解是正确的,还是有更好的解决方案?

注意:getMatrix对于不同的向量,我将多次使用该函数,并将获得的值复制到不同的矩阵中,这些矩阵不包含在呈现的代码部分中。逗号初始化器不适用于我的问题。

class MatrixModificationClass
{
 private:
 //two matrices defined
    MatrixXd containerMatrix; //a container
    MatrixXd modelMatrix;   //the proper matrix

 public:
    MatrixModificationClass();

//a function to create vector and map it to matrix 
 void getMatrix(std::vector ivector)
 { 
  std::vector<double> containerVector;
  //This is only a simplified example, in reality I change string to a vector
  containerVector=ivector; 
  int instances=10, columns=10;  //size of matrix

  containerMatrix = MatrixXd::Map(&containerVector[0], columns, instances);
  containerMatrix.transposeInPlace();
 };   

 void setModelMatrix()
 {
     modelMatrix = containerMatrix;
 };
};

main()
{
 std::vector newVector;
 MatrixModificationClass Example;
  for (int i = 1; i <= 100; i++) 
   newVector.push_back(i);
 Example.getMatrix(newVector);
 Example.setModelMatrix();
}

标签: c++dictionarymatrixpass-by-referenceeigen

解决方案


您的代码是安全的(尽管不是最佳的)。

在这一行

containerMatrix = MatrixXd::Map(&containerVector[0], columns, instances);

Eigen::Map创建指向的对象&containerVector[0],然后将其内容复制到containerMatrixMatrixXd对象始终拥有其数据)。然后Eigen::Map被破坏(它超出了 的范围;),而containerVector仅在方法结束时被破坏。

作为一个简单的优化,您可以transposeInPlace()通过直接分配来避免 ,

containerMatrix = MatrixXd::Map(&containerVector[0], columns, instances).transpose();

根据您“将字符串更改为向量”的方式,您可能可以直接写入containerMatrix(在执行此操作之前您需要将其调整为正确的尺寸)。您还可以将内部存储containerVector在您的类中(而不是),并在需要时动态containerMatrix创建一个。Eigen::Map不过,最有效的解决方案取决于您的实际用例。


推荐阅读