C++ 使用特征::映射构建矩阵时函数内向量的内存分配

C++ 使用特征::映射构建矩阵时函数内向量的内存分配,c++,dictionary,matrix,pass-by-reference,eigen,C++,Dictionary,Matrix,Pass By Reference,Eigen,我创建了一个类,该类读取向量并将结果复制到所需的矩阵(事实上,它将字符串更改为向量,解析的向量大小未知,但我发布了一个简化的代码) 函数getMatrix读取向量,将其复制到向量containerVector,并使用函数Map将其重塑为矩阵,containerMatrix通过引用传递。但是,在执行该函数后,对象containerVector被销毁,据我所知,containerMatrix不指向任何地方(或指向内存中的某个随机位置)。因此,当我执行第二个函数setModelMatrix时,它应该返

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

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

注意:对于不同的向量,我将多次使用函数
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();
}
类矩阵修改类
{
私人:
//定义了两个矩阵
MatrixXd containerMatrix;//一个容器
MatrixXd modelMatrix;//正确的矩阵
公众:
MatrixModificationClass();
//创建向量并将其映射到矩阵的函数
void getMatrix(标准::向量ivector)
{ 
std::向量容器向量机;
//这只是一个简化的示例,实际上我将字符串更改为向量
containerVector=ivector;
int instances=10,columns=10;//矩阵的大小
containerMatrix=MatrixXd::Map(&containerVector[0],列,实例);
containerMatrix.transposeInPlace();
};   
void setModelMatrix()
{
模型矩阵=容器矩阵;
};
};
main()
{
std::vector newVector;
MatrixModificationClass示例;
对于(inti=1;i您的代码是安全的(尽管是次优的)

在这一行

containerMatrix = MatrixXd::Map(&containerVector[0], columns, instances);
创建指向
&containerVector[0]
Eigen::Map
对象,然后将其内容复制到
containerMatrix
(a
MatrixXd
对象始终拥有其数据)。然后
Eigen::Map
被销毁(它在
处超出范围;
),而
containerVector
仅在方法结束时销毁

作为一个简单的优化,您可以通过直接分配

containerMatrix = MatrixXd::Map(&containerVector[0], columns, instances).transpose();
根据“将字符串更改为向量”的方式,您可能可以直接写入
containerMatrix
(在执行此操作之前,您需要将其调整为正确的尺寸)。 您还可以在类中存储
containerVector
(而不是
containerMatrix
),并在需要时动态创建
Eigen::Map

不过,最有效的解决方案取决于您的实际用例。

谢谢您的回答。事实上,
adding.transpose()
可以优化代码。在我的情况下,我不认为直接写入
containerMatrix
是可能的,因为我以前尝试过。输入矩阵是以选项卡分隔的未知维度的数据文件。我使用
getline
stringstream
导入数据。