使用带有lambda函数的RcppArmadillo每个列?
根据犰狳网站,您可以将lambda函数传入使用带有lambda函数的RcppArmadillo每个列?,r,rcpp,R,Rcpp,根据犰狳网站,您可以将lambda函数传入 X.each_col([](vec&a){a.print();}) 但以下Rcpp似乎有错误,报告“预期表达式” #包括 //[[Rcpp::depends(RcppArmadillo)]] 使用名称空间Rcpp; 使用arma; //[[Rcpp::导出]] arma::vec colCumSum(常数arma::mat&X){ 返回X.each_col([](常量arma::vec&b){b.cumsum();}); } 实际上,为了获得lambd
X.each_col([](vec&a){a.print();})代码>
但以下Rcpp似乎有错误,报告“预期表达式”
#包括
//[[Rcpp::depends(RcppArmadillo)]]
使用名称空间Rcpp;
使用arma;
//[[Rcpp::导出]]
arma::vec colCumSum(常数arma::mat&X){
返回X.each_col([](常量arma::vec&b){b.cumsum();});
}
实际上,为了获得lambda支持,您必须告诉R使用C++11。神奇的一行是[[Rcpp::plugins(“cpp11”)]
,这使它能够正常工作:
但一旦我这样做了,我就会在cumsum()
上遇到问题。您的const
也太多了
因此,这里有一个更简单的版本,它可以使用文档中的另一个lambda
,它只是打印出来的。我还转向了ivec
和imat
以获得一致性:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins("cpp11")]]
// [[Rcpp::export]]
arma::ivec colCumSum(arma::imat& X) {
X.each_col( [](arma::ivec& a){ a.print(); } );
return X.col(0);
}
/*** R
M <- matrix(1:16, 4, 4)
colCumSum(M)
*/
实际上,为了获得lambda支持,您必须告诉R使用C++11。神奇的一行是[[Rcpp::plugins(“cpp11”)]
,这使它能够正常工作:
但一旦我这样做了,我就会在cumsum()
上遇到问题。您的const
也太多了
因此,这里有一个更简单的版本,它可以使用文档中的另一个lambda
,它只是打印出来的。我还转向了ivec
和imat
以获得一致性:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins("cpp11")]]
// [[Rcpp::export]]
arma::ivec colCumSum(arma::imat& X) {
X.each_col( [](arma::ivec& a){ a.print(); } );
return X.col(0);
}
/*** R
M <- matrix(1:16, 4, 4)
colCumSum(M)
*/
谢谢事实证明,调用cumsum的正确方法是cumsum(b)
。此外,进一步挖掘犰狳已经有了一种方法,可以使用cumsum(X,0)
对log的cumsum或其他转换使用lambda。但是谢谢你的跟进!谢谢事实证明,调用cumsum的正确方法是cumsum(b)
。此外,进一步挖掘犰狳已经有了一种方法,可以使用cumsum(X,0)
对log的cumsum或其他转换使用lambda。但是谢谢你的跟进!
> sourceCpp("/tmp/foo.cpp")
> M <- matrix(1:16, 4, 4)
> colCumSum(M)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
>