- こちらからの続き
- 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)=Rcpp::clone(x);
double r = as<double>(runif(1));
int r2=rand() % 4;
srand(time(NULL));
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]])
}