c++ - 使用 Eigen::Map 构建矩阵时函数内部向量的内存分配
问题描述
我创建了一个读取向量并将结果复制到所需矩阵的类(实际上它将字符串更改为向量并且解析的向量的大小未知,但我发布了一个简化的代码)。
该函数getMatrix
读取一个向量,将其复制到该向量中containerVector
,并使用一个函数Map
将其重塑为一个矩阵,containerMatrix
通过引用传递。但是,在执行该函数后,该对象containerVector
被销毁,据我所知 Eigen Map tutorial,containerMatrix
指向无处(或指向内存中的某个随机位置)。因此,当我执行第二个函数 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();
}
解决方案
您的代码是安全的(尽管不是最佳的)。
在这一行
containerMatrix = MatrixXd::Map(&containerVector[0], columns, instances);
Eigen::Map
创建指向的对象&containerVector[0]
,然后将其内容复制到containerMatrix
(MatrixXd
对象始终拥有其数据)。然后Eigen::Map
被破坏(它超出了 的范围;
),而containerVector
仅在方法结束时被破坏。
作为一个简单的优化,您可以transposeInPlace()
通过直接分配来避免 ,
containerMatrix = MatrixXd::Map(&containerVector[0], columns, instances).transpose();
根据您“将字符串更改为向量”的方式,您可能可以直接写入containerMatrix
(在执行此操作之前您需要将其调整为正确的尺寸)。您还可以将内部存储containerVector
在您的类中(而不是),并在需要时动态containerMatrix
创建一个。Eigen::Map
不过,最有效的解决方案取决于您的实际用例。
推荐阅读
- php - 在php中下载大文件的正确方法
- go - Go 中的 len(string) 和 len(slice)s O(1) 操作吗?
- python - python解析json文件
- javascript - 如何在节点 js 中检查文本框 id 是否为空
- azure-machine-learning-service - 如何从本地部署的 AzureML 容器中公开端口?
- reactjs - 如果它在对象内部,如何更新 redux reducer 中的值
- javascript - React-select {creatable} 与用户输入的条目一起工作,因为只显示没有选项
- firebase - 是否可以将通配符与斜杠之间的其他文本或通配符组合为 Firestore 规则中 get() 或 exists() 路径的一部分?
- json - Powershell - 大括号内大括号的 JSON 语法
- php - 我如何检索发布帖子的用户