将 lambda 函数应用于 `RcppArmadillo` 中的 `arma::cube`

     2023-02-16     233

关键词:

【中文标题】将 lambda 函数应用于 `RcppArmadillo` 中的 `arma::cube`【英文标题】:Apply lambda function to `arma::cube` in `RcppArmadillo` 【发布时间】:2020-12-02 08:48:11 【问题描述】:

我尝试使用RcppArmadillo 计算数组每个切片的 Frobenious 范数 (arma::cube)。文件cxxFuns.cpp 中的示例代码如下所示。

// [[Rcpp::depends(RcppArmadillo)]]
#include "RcppArmadillo.h"

// [[Rcpp::export]]
arma::vec array_norm (arma::cube & x) 
    arma::vec out = x.each_slice([](arma::mat& x0) return arma::norm(x0, "fro") ;) ;
    return out ;


cpp文件编译成功后,函数array_norm抛出异常:

set.seed(2020)
Rcpp::sourceCpp('cxxFuns.cpp')
x <- array(rnorm(3*4*5), 3:5)
array_norm(x)
#> error: copy into matrix: can't interpret cube with dimensions 3x4x5 as a vector
#> Error in array_norm(x) : 
#>   copy into matrix: can't interpret cube with dimensions 3x4x5 as a vector

由reprex package 创建于 2020-12-02 (v0.3.0)

【问题讨论】:

【参考方案1】:

这实际上是来自 Armadillo 的错误消息,因为您的逻辑还存在问题——结果不是向量。你可以通过改成这个(独立的,一个非常好的 Rcpp 技巧)代码来看到:

代码

// [[Rcpp::depends(RcppArmadillo)]]
#include "RcppArmadillo.h"

// [[Rcpp::export]]
bool array_norm (arma::cube & x) 
    auto out = x.each_slice([](arma::mat& x0) return arma::norm(x0, "fro") ;) ;
    out.print("out");
    return true;


/*** R
set.seed(2020)
x <- array(rnorm(3*4*5), 3:5)
array_norm2(x)
*/

输出

> Rcpp::sourceCpp("~/git/***/65104769/answer.cpp")

> set.seed(2020)

> x <- array(rnorm(3*4*5), 3:5)

> array_norm2(x)
out
[cube slice 0]
   0.3770  -1.1304   0.9391   0.1174
   0.3015  -2.7965  -0.2294  -0.8531
  -1.0980   0.7206   1.7591   0.9093

[cube slice 1]
   1.1964   1.8000  -2.2890   1.0982
  -0.3716   1.7040   0.0583   0.3182
  -0.1233  -3.0388   2.1744  -0.0731

[cube slice 2]
   0.8343   0.9367  -0.8125   2.4354
   0.1988  -0.1474  -0.7437   0.3881
   1.2978   0.1104   1.0953   0.2906

[cube slice 3]
  -0.2856   0.4472  -0.3010   0.2531
   0.0760   0.9085  -0.7260  -0.3707
  -0.5603  -0.5051  -1.1801   0.0222

[cube slice 4]
   0.6600   0.6014   0.1188  -1.3283
   0.4888  -0.6738   0.1212  -0.5669
  -0.1888   0.4761  -0.1860   0.5788

[1] TRUE

【讨论】:

我总觉得 Rcpp* 函数中的 for-loop 很冗长,虽然它很快。在这个玩具示例中,有什么方法可以提取 lambda 函数的结果吗?

将条件 Lambda 应用于 Series 与 DataFrame [重复]

】将条件Lambda应用于Series与DataFrame[重复]【英文标题】:ApplyingConditionalLambdatoSeriesversusDataFrame[duplicate]【发布时间】:2020-10-1902:32:41【问题描述】:我正在尝试使用基于NA日期的模型来估算系列中的NA值。在将条件lambda函数应用于... 查看详情

在 pandas 中将 lambda 函数应用于列失败

】在pandas中将lambda函数应用于列失败【英文标题】:Applyingalambdafunctiontoacolumngotfailedinpandas【发布时间】:2013-11-1522:46:36【问题描述】:我不知道为什么索引方法在执行按列应用功能时会出现不一致的行为。数据框为:df=pd.DataFram... 查看详情

熊猫将 lambda 应用于整个数据框 [重复]

】熊猫将lambda应用于整个数据框[重复]【英文标题】:Pandasapplylambdatotheentiredataframe[duplicate]【发布时间】:2018-03-2711:00:45【问题描述】:谁能解释一下为什么这段代码不能工作?wordsCount=defaddWord(x):print(x)df.apply(addWord(x))返回错误... 查看详情

使用 Terraform 将自动缩放配置应用于 lambda 预置并发

】使用Terraform将自动缩放配置应用于lambda预置并发【英文标题】:ApplyautoscalingconfigurationtolambdaprovisionedconcurrencywithTerrraform【发布时间】:2020-09-2411:19:33【问题描述】:有没有办法使用terraform将自动扩展配置应用于AWSLambda预置并... 查看详情

将 functools.lru_cache 应用于 lambda

】将functools.lru_cache应用于lambda【英文标题】:Applying`functools.lru_cache`tolambda【发布时间】:2015-11-0802:51:02【问题描述】:所以我在Python中为斐波那契数列制作了一个递归lambda。我使用递归是因为它最容易用lambda实现。fib=lambdan:fib(... 查看详情

将 Lambda 应用于返回另一个列表的列表的 Java 8 惯用方法?

】将Lambda应用于返回另一个列表的列表的Java8惯用方法?【英文标题】:Java8idiomaticwaytoapplyaLambdatoaListreturninganotherList?【发布时间】:2014-11-3001:46:34【问题描述】:将lambda应用于列表中的每个项目并返回由结果组成的列表的最惯... 查看详情

如何将 lambda 函数正确应用到 pandas 数据框列

】如何将lambda函数正确应用到pandas数据框列【英文标题】:Howtoproperlyapplyalambdafunctionintoapandasdataframecolumn【发布时间】:2016-09-2212:45:20【问题描述】:我有一个pandas数据框sample,其中一个名为PR的列正在对其应用lambda函数,如下... 查看详情

如果它是一个抽象方法,forEach 如何将 lambda 表达式应用于数组?

】如果它是一个抽象方法,forEach如何将lambda表达式应用于数组?【英文标题】:HowdoesforEachapplythelambdaexpressiontoanarrayifit\'sanabstractmethod?【发布时间】:2020-03-2002:00:36【问题描述】:List<String>friends=Arrays.asList("Brian","Nate","Neal","... 查看详情

将 pytz 导入 AWS lambda 函数

】将pytz导入AWSlambda函数【英文标题】:ImportpytzintoAWSlambdafunction【发布时间】:2016-04-2616:26:52【问题描述】:我正在编写一个适用于日期时间的lambda函数并尝试导入pytz,以便在比较时考虑时区。importboto3importpytzfromdatetimeimporttimede... 查看详情

CloudFormation 模板 - 将现有 IAM 角色用于 Lambda 函数

】CloudFormation模板-将现有IAM角色用于Lambda函数【英文标题】:CloudFormationtemplate-UsingexistingIAMroleinforLambdafunctions【发布时间】:2021-09-2811:15:12【问题描述】:我正在尝试使用cloudformation模板中的现有角色(存在于AWS账户中)来设置l... 查看详情

将自动缩放策略应用于 DynamoDB 表时出现 ObjectNotFoundException

...】:2018-10-1220:07:43【问题描述】:我正在使用boto3SDK运行lambda函数,以便将自动缩放策略添加到许多dynamoDB表和索引,但是它始终抛出此错误:调用PutS 查看详情

python的高级特征及用法介绍

...运算来说,这是一种非常干净而且可读的执行方式。2、Lambda函数Lambda函数是一种比较小的匿名函数——匿名是指它实际上没有函数名。Python函数通常使用defa_function_name()样式来定义,但对于lambda函数,我们根本没为它命名。这是... 查看详情

sorted()和lambda-->应用:字典排序

参考技术A注意,既然我们称lambda为匿名函数,所以官方并不建议用func去接收,而是直接使用sorted()函数不会改变数组本身而list.sort()会对list进行修改:list.sort()函数只适用于数组,而sorted()还能用于其他数据结构:下面用三个元组,组... 查看详情

java之lambda表达式

...给?一个?方法,也?无法声明返回?一个函数的?方法。 Lambda表达式为Java添加了了缺失的函数式编程特性,使我们能将函数当做?一等公?民看待在将函数作为?一等公?民的语?言中,Lambda表达式的类型是函数。但在Java中,Lambda表达... 查看详情

lambda匿名函数,map,filter,reduce,zip,介绍

sum_1=lambdax,y:x+yprint(sum_1(1,2))  l=[1,2,3,4]print(list(map(lambdax:x*4,l)))#map()将函数func应用于序列seq中的所有元素。#在Python3之前,map()返回一个列表,#列表中的每个元素都是将列表或元组“seq”中的相应元素传入函数func返回的结... 查看详情

如何集成 API Gateway 调用带参数的 Lambda 函数?

】如何集成APIGateway调用带参数的Lambda函数?【英文标题】:HowtointegrateAPIGatewaytocallLambdafunctionwithaparameter?【发布时间】:2021-02-0803:04:55【问题描述】:我有一个将文件上传到S3的反应应用程序。当用户按下按钮从文件中提取文本... 查看详情

将函数应用于列表的每个元素

】将函数应用于列表的每个元素【英文标题】:Applyfunctiontoeachelementofalist【发布时间】:2014-09-2418:51:39【问题描述】:如何将函数应用于变量输入列表?例如filter函数返回真值,但不是函数的实际输出。fromstringimportuppermylis=[\'thi... 查看详情

为啥捕获 lambda 不能应用于 std::valarray?

】为啥捕获lambda不能应用于std::valarray?【英文标题】:Whythecapturinglambdacannotbeappliedtothestd::valarray?为什么捕获lambda不能应用于std::valarray?【发布时间】:2017-09-0311:49:07【问题描述】:什么不符合捕获lambda被传递给std::valarray的apply... 查看详情