我创建了一个读取向量的类,并将结果复制到所需的矩阵中(实际上,它将字符串更改为向量,并且所解析的向量的大小未知,但是我发布了简化的代码)。
[函数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
。不过,最有效的解决方案取决于您的实际用例。