[使用Eigen :: Map构建矩阵时函数内部向量的内存分配

问题描述 投票:0回答:1

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

[函数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++ dictionary matrix pass-by-reference eigen
1个回答
0
投票
在此行

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。不过,最有效的解决方案取决于您的实际用例。

© www.soinside.com 2019 - 2024. All rights reserved.