c++ - 如何返回引用局部变量的特征表达式?
问题描述
我想做一个返回特征表达式的函数。该表达式的一些输入是该函数中的局部变量。然而,随着函数返回这些局部变量超出范围。稍后,当计算表达式时,会读取一些垃圾数据,从而产生错误的结果。
简单的例子:
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++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
仍然活着。
推荐阅读
- tensorflow - 将 hub.text_embedding_column 与 tf.contrib.estimator.RNNClassifier 一起使用
- linker - 精灵加载器中的静态地址与执行地址
- r - Need to subset by excluding multiple values in a categorical variable
- angular - Angular - 如何通过组件将动态 SVG 插入 DOM
- angular - 如何防止在 RxJS 中执行延迟订阅回调?
- botframework - 在 FB Messenger 频道(BotFramework v3,Nodejs)中单击快速回复时获取字符串化对象而不是带有文本的字符串
- powershell - 将无聊的任务自动化
- php - 谷歌应用引擎 php 连接到外部 microsoft sql server 数据库
- amazon-web-services - 来自 AWS SQS 的消息消费是原子的吗?
- javascript - 带有自定义滚动条的 jQuery 表格主体