- 前の記事でinlineパッケージのcxxfunction()を使ってC++化することを書いた
- 問題は、cxxfunction()を使えるようになること
- 語学の勉強なので、「動く言葉」を蒐集してなんとか使えるようになればよいだろう
- "cxxfunction"をキーワードに検索をかけてリンクを張っておけばよさそう
- こちら
- こちら
- こちら
- こちら
- こちら
- と、検索してリンクを張っていたら、すでにこちらの記事に戻ってきてしまった。
- さて、練習
- cxxfunction()の引数signature
- 「Aという変数があって、それは"numeric"ですよ」
signature(A="numeric")
my.body<-'
####
'
# 引数として渡されたAをC++の数値ベクトル x とする
NumericVector x(A);
# ベクトルxの長さ x.length()を使って、整数n出す
int n = x.length()-1;
# 返り値用ベクトルを作る(長さを指定)
NumericVector y(n);
# ループする
for (int i = 0; i < n; i++) {
y(i)=x(i)-x(i+1);
}
# 返すのは変数y
return wrap(y);
library(Rcpp)
library(inline)
my.body <- '
NumericVector x(A);
int n = x.length()-1;
NumericVector y(n);
for (int i = 1; i < n; i++) {
y(i)=x(i)-x(i+1);
}
return wrap(y);
'
my.diff <- cxxfunction(sig=signature(A="numeric"), body=my.body, plugin="Rcpp")
N<-100000
A<-runif(N)
my.out<-my.diff(A)
hist(my.out)
library(Rcpp)
library(inline)
my.body <- '
IntegerVector a(A);
IntegerVector b(B);
int n = a.length();
NumericMatrix x(n,3);
x(0,0)=0;
x(0,1)=0;
x(0,2)=0;
for (int i = 1; i < n; i++) {
x(i,0)=x(i-1,0);
x(i,1)=x(i-1,1);
x(i,2)=x(i-1,2);
x(i,a[i])+=b[i];
}
return wrap(x);
'
my.diff <- cxxfunction(sig=signature(A="integer",B="integer"), body=my.body, plugin="Rcpp")
T<-100000
A<-sample(0:2,T,replace=TRUE)
B<-sample(c(-1,1),T,replace=TRUE)
my.out<-my.diff(A,B)
library(rgl)
T.less<-1000
plot3d(my.out[1:T.less,],cex=0.1)
plot(as.data.frame(my.out),cex=0.01)