[Rcpp-devel] How to increase the coding efficiency
Honglang Wang
wanghonglang2008 at gmail.com
Tue Dec 4 21:27:42 CET 2012
Since the "ker" function defined in R is very simple and vectorized, I
thought it was fine to call this function in C++. And I tried to code this
function inside C++, and I found it became ever slower: from 47.310s to
49.536s.
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::export]]
List betahat(double t0, NumericMatrix Xr, NumericMatrix yr, NumericVector
tr, double h, int m) {
int n = Xr.nrow(), p = Xr.ncol();
arma::mat X(Xr.begin(), n, p, false);
arma::mat y(yr.begin(), n, 1, false);
arma::colvec t(tr.begin(), tr.size(), false);
arma::mat T = X;
T.each_col() %= (t-t0)/h;
arma::mat D = arma::join_rows(X,T);
arma::vec tp = t-t0;
arma::uvec q1 = arma::find(arma::abs(tp)<h);
arma::uvec q2 = arma::find(arma::abs(tp)>=h);
arma::vec kk = t;
kk.elem(q1) = ((1-arma::pow(tp.elem(q1)/h,2))/h)*0.75;
kk.elem(q2).zeros();
arma::mat W = (arma::diagmat(kk))/m;
arma::mat Inv = arma::trans(D)*W*D;
arma::vec betahat = arma::inv(Inv)*arma::trans(D)*W*y;
arma::colvec betahat0(betahat.begin(),betahat.size()/2,false);
return List::create(Named("betahat") = betahat0);
}
Best wishes!
Honglang Wang
Office C402 Wells Hall
Department of Statistics and Probability
Michigan State University
1579 I Spartan Village, East Lansing, MI 48823
wangho16 at msu.edu
On Tue, Dec 4, 2012 at 2:19 PM, Romain Francois <romain at r-enthusiasts.com>wrote:
> You are calling back to R using Function. This is expensive.
>
> What is ker ? Can you implement it in C++. This is a wild guess, but that
> is I think where the bottleneck is.
>
> Romain
>
> Le 04/12/12 20:14, Honglang Wang a écrit :
>
>> Dear All,
>> I have tried out the first example by using RcppArmadillo, but I am not
>> sure whether the code is efficient or not. And I did the comparison of
>> the computation time.
>>
>> 1) R code using for loop in R: 87.22s
>> 2) R code using apply: 77.86s
>> 3) RcppArmadillo by using for loop in C++: 53.102s
>> 4) RcppArmadillo together with apply in R: 47.310s
>>
>> It is kind of not so big increase. I am wondering whether I used an
>> inefficient way for the C++ coding:
>>
>>
>> // [[Rcpp::depends(RcppArmadillo)**]]
>>
>> #include <RcppArmadillo.h>
>>
>> using namespace Rcpp;
>>
>> // [[Rcpp::export]]
>> List betahat(Function ker, double t0, NumericMatrix Xr, NumericMatrix
>> yr, NumericVector tr, double h, int m) {
>> int n = Xr.nrow(), p = Xr.ncol();
>> arma::mat X(Xr.begin(), n, p, false);
>> arma::mat y(yr.begin(), n, 1, false);
>> arma::colvec t(tr.begin(), tr.size(), false);
>> arma::mat T = X;
>> T.each_col() %= (t-t0)/h;
>> arma::mat D = arma::join_rows(X,T);
>> arma::vec kk =as<arma::vec>(ker(tr-t0,h));
>> arma::mat W = (arma::diagmat(kk))/m;
>> arma::mat Inv = arma::trans(D)*W*D;
>> arma::vec betahat = arma::inv(Inv)*arma::trans(D)***W*y;
>> arma::colvec betahat0(betahat.begin(),**betahat.size()/2,false);
>> return List::create(Named("betahat") = betahat0);
>> }
>>
>> Anyone could help me with how to increase the efficiency of the coding?
>> Thanks.
>>
>>
>>
>> Best wishes!
>> Honglang Wang
>> Office C402 Wells Hall
>> Department of Statistics and Probability
>> Michigan State University
>> 1579 I Spartan Village, East Lansing, MI 48823
>> wangho16 at msu.edu <mailto:wangho16 at msu.edu>
>>
>
>
> --
> Romain Francois
> Professional R Enthusiast
> +33(0) 6 28 91 30 30
>
> R Graph Gallery: http://gallery.r-enthusiasts.**com<http://gallery.r-enthusiasts.com>
> `- http://bit.ly/SweN1Z : SuperStorm Sandy
>
> blog: http://romainfrancois.blog.**free.fr<http://romainfrancois.blog.free.fr>
> |- http://bit.ly/RE6sYH : OOP with Rcpp modules
> `- http://bit.ly/Thw7IK : Rcpp modules more flexible
>
> ______________________________**_________________
> Rcpp-devel mailing list
> Rcpp-devel at lists.r-forge.r-**project.org<Rcpp-devel at lists.r-forge.r-project.org>
> https://lists.r-forge.r-**project.org/cgi-bin/mailman/**
> listinfo/rcpp-devel<https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20121204/b90d6d46/attachment.html>
More information about the Rcpp-devel
mailing list