2017-02-19 72 views
1

根據犰狳網站,你可以在lambda函數傳遞到.each_col,如使用帶lambda函數的RcppArmadillo each_col?

X.each_col([](vec& a){ a.print(); });

以下RCPP似乎有一個錯誤,雖然,報告「預期的表達」

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

using namespace Rcpp; 
using namespace arma; 

// [[Rcpp::export]] 
arma::vec colCumSum(const arma::mat& X) { 
    return X.each_col([](const arma::vec& b){ b.cumsum(); }); 
} 

回答

4

您實際上必須告訴R使用C++ 11才能獲得lambda支持。神奇的線是[[Rcpp::plugins("cpp11")]],這使它的一切工作:

但一旦我這樣做,我得到的問題cumsum()。那裏你也有太多const

所以這裏是一個簡單的版本,其中確實從另一個lambda從文檔 - 只是打印。我也轉向ivecimat的一致性:

#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()所做減少的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 
> 
+1

謝謝!原來調用cumsum的正確方法是'''cumsum(b)'''。此外,進一步挖掘Armadillo已經有一種方法可以使用'''cumsum(X,0)''''''''''''''''' – JCWong

+0

每列執行cumsum。您仍可以使用lambda作爲日誌或其他轉換的cumsum。但感謝後續! –