Deep copyしたりとか

  • こちらからの続き
  • 2次元離散拡散シミュレーションができれば、かなりの用が足りる
  • やってみる
  • やってみる上でいくつかのひっかかりが出るので、メモしておく
# 行列の世代更新
# 空を作って
Rcpp::IntegerMatrix tmpx(2*n1,2*n2);
# 写す
std::copy(x.begin(),x.end(),tmpx.begin());
# 色々やって
# 更新する
std::copy(tmpx.begin(),tmpx.end(),x.begin());
# 世代ごとの行列をリストyの第i番に格納する
# clone()関数を使ってディープコピーする
y(i)=Rcpp::clone(x);
# runif(1)で返ってくるオブジェクトはRccp::NumericVecotor オブジェクトなので、それを、doubleのスカラーにするためには、こんな風に書く
double r = as<double>(runif(1));
# C++がrand()で作る乱数は、スカラーなので、以下でよい
int r2=rand() % 4;
# 疑似乱数列のシードを時刻から取る
srand(time(NULL));
# cxxfunction()を使うときに時刻取得(time())をするのでそのためのctimeをincludeしたりする
 include=c("#include <ctime>","#include <cstdlib>")
library(Rcpp)
library(inline)

src<-'
srand(time(NULL));
int n1=as<int>(N1);
int n2=as<int>(N2);
double k=as<double>(K);
int p=as<int>(P);
int t=as<int>(T);
Rcpp::List y(t);
Rcpp::IntegerMatrix x(2*n1,2*n2);
Rcpp::IntegerMatrix tmpx(2*n1,2*n2);
x(n1-1,n2-1)=p;
for(int i=0;i<t;i++){
		y(i)=Rcpp::clone(x);
		Rcpp::IntegerMatrix tmpx(2*n1,2*n2);

	for(int j1=0;j1<n1*2;j1++){
		for(int j2=0;j2<n2*2;j2++){
			for(int j3=0;j3<x(j1,j2);j3++){
				double r = as<double>(runif(1));
				if(r<k){
					int r2=rand() % 4;
					if(r2==0){
						if(j1+1<n1*2){
							tmpx(j1+1,j2)++;
						}
					}else if(r2==1){
						if(j1-1>-1){
							tmpx(j1-1,j2)++;
						}
					}else if(r2==2){
						if(j2+1<n2*2){
							tmpx(j1,j2+1)++;
						}
					}else{
						if(j2-1>-1){
							tmpx(j1,j2-1)++;
						}
					}
				}else{
					tmpx(j1,j2)++;
				}
			}
			
		}
	}
	for(int j1=0;j1<n1*2;j1++){
		for(int j2=0;j2<n2*2;j2++){
			x(j1,j2)=tmpx(j1,j2);
		}
	}
		
}

return(y);
'

fx.test1<-cxxfunction(signature(N1="integer",N2="integer",K="numeric",P="integer",T="integer"), include=c("#include <ctime>","#include <cstdlib>"),src,plugin="Rcpp")

N1<-10
N2<-10
K<-0.2
P<-100
T<-100

res<-fx.test1(N1,N2,K,P,T)

par(ask=TRUE)
for(i in 1:T){
	image(res[[i]])
	
}