首页 > 解决方案 > 如何返回引用局部变量的特征表达式?

问题描述

我想做一个返回特征表达式的函数。该表达式的一些输入是该函数中的局部变量。然而,随着函数返回这些局部变量超出范围。稍后,当计算表达式时,会读取一些垃圾数据,从而产生错误的结果。

简单的例子:

template<typename T>
auto f(const T& x){
    Eigen::ArrayXXd temp = exp(x);
    return temp * (1 - temp);
}

活生生的例子

EDIT2:另一个更现实的例子,不仅仅是元素明智的操作:

template <typename T>
auto softmax(const T& x){
    Eigen::ArrayXXd tmp = exp(x - x.maxCoeff());
    return tmp / tmp.sum();
}

有没有办法将这种局部变量的生命周期延长到表达式的生命周期?或者除了在从函数返回结果之前评估结果之外别无他法?

编辑:我正在寻找优化现有库的方法。所以我不能过多地改变函数签名——返回类型必须是 Eigen 表达式。

标签: c++eigen

解决方案


从 C++14 开始,您可以使用init-capture list将其存储temp为 lambda 表达式生成的闭包的数据成员:

template<typename T>
auto f2(const T& x) {
    return [temp = exp(x).eval()](){ return temp * (1-temp); };
}

call 的语法很有趣:

Eigen::ArrayXXd y = f2(x)();

但它按预期工作,因为由创建的临时对象在f2(x)完整表达式结束时被销毁,因此可以正确评估结果,y = ..因为temp仍然活着。

演示


推荐阅读