gpt4 book ai didi

c++ - Eigen::Matrix 释放数据的解决方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:20 26 4
gpt4 key购买 nike

我想对来自另一个库的数据使用 Eigen3。较早的 answer ggael 表示 Eigen::Matrix 使用 new 关键字采用预先存在的数据的方法。然而,这对我来说还不够,因为生成的 Matrix 似乎仍然获得了数据的所有权,这意味着它会在超出范围时释放数据。也就是说,如果 data 最终被它来自的库删除,这将是一个崩溃:

void crasher(double* data, size_t dim)
{
MatrixXd m;

new (&m) Map<MatrixXd>(data,dim,dim); // matrix adopts the passed data
m.setRandom(); cout<<m<<endl; // manipulation of the passed data via the Matrix interface
} // data deleted by m => potential problem in scope of function call

我想出了两个解决方法:

void nonCrasher1(double* data, size_t dim)
{
MatrixXd m; // semantically, a non-owning matrix
const Map<const MatrixXd> cache(m.data(),0,0); // cache the original „data” (in a const-correct way)

new (&m) Map<MatrixXd>(data,dim,dim); // matrix adopts the passed data
m.setRandom(); cout<<m<<endl; // manipulation of the passed data via the Matrix interface

new (&m) Map<const MatrixXd>(cache); // re-adopting the original data
} // original data deleted by m

由于 cache 的存在,这很不方便。另一个没有这个问题:

void nonCrasher2(double* data, size_t dim) // no need for caching
{
MatrixXd m; // semantically, a non-owning matrix

new (&m) Map<MatrixXd>(data,dim,dim); // matrix adopts the passed data
m.setRandom(); cout<<m<<endl; // manipulation of the passed data via the Matrix interface

new (&m) Map<MatrixXd>(nullptr,0,0); // adopting nullptr for subsequent deletion
} // nullptr „deleted” by m (what happens with original data [if any]?)

但是,这里不清楚 m 的原始数据会发生什么(如果有的话——所有这些在 Eigen3 的文档中都不完全清楚)。

我的问题是,Eigen::Matrix 是否有一种规范的方式来释放其数据的所有权(自行分配或采用)。

最佳答案

nonCrasher2数据没有任何变化,只是它被故意填充了随机值。

但是,这看起来仍然很老套,干净的方法是使用 Map对象而不是 MatrixXd :

Map<MatrixXd> m(data, dim, dim);
m.setRandom();

如果需要m成为MatrixXd因为你需要调用函数 MatrixXd对象,并且此类函数无法模板化,那么您可以考虑将这些函数泛化为 Ref<MatrixXd>对象。默认情况下,一个 Ref<MatrixXd>可以接受存储重组为 MatrixXd 的任何表达式具有任意领先尺寸。它已在 Eigen 3.2 中引入,请查看文档以获取更多详细信息。

关于c++ - Eigen::Matrix 释放数据的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20240500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com