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
(aMatrixXd
对象始终拥有其数据)。然后Eigen::Map
被销毁(它在处超出范围;
),而containerVector
仅在方法结束时销毁
作为一个简单的优化,您可以通过直接分配
containerMatrix = MatrixXd::Map(&containerVector[0], columns, instances).transpose();
根据“将字符串更改为向量”的方式,您可能可以直接写入containerMatrix
(在执行此操作之前,您需要将其调整为正确的尺寸)。
您还可以在类中存储containerVector
(而不是containerMatrix
),并在需要时动态创建Eigen::Map
。
不过,最有效的解决方案取决于您的实际用例。谢谢您的回答。事实上,adding.transpose()
可以优化代码。在我的情况下,我不认为直接写入containerMatrix
是可能的,因为我以前尝试过。输入矩阵是以选项卡分隔的未知维度的数据文件。我使用getline
和stringstream
导入数据。