我一直使用inline / RcppArmadillo编写一些模拟,并偶然发现了RNGScope的问题。这是一个错误还是我做的事情真的很蠢?我已将该功能清空以使其可读(见下文)。
干杯, 编
library(inline)
code_cpp <- '
using namespace arma;
// From R
uvec x0 = as<uvec>(x0_r);
vec time_vec = as<vec>(time_vec_r);
// Declare variables
umat simulation_data=zeros<umat>(x0.n_elem, time_vec.n_elem);
RNGScope scope;
return wrap(simulation_data);
'
gillespie_sim <- cxxfunction(body = code_cpp,
sig = signature(x0_r = "integer", time_vec_r= "numeric"),
plugin = "RcppArmadillo")
x0 <- c(1,0,0,0,0,0)
time_vec <- 1:800
set.seed(23)
for(i in 1:100000) out2 <- gillespie_sim(x0_r=x0,time_vec_r=time_vec)
我得到的错误
R(43305)malloc: *对象0x108c30a00的错误:释放对象的校验和不正确 - 对象可能在被释放后被修改。 * 在malloc_error_break中设置断点以进行调试 中止陷阱:6
答案 0 :(得分:0)
a)您使用umat
,但我们在R中没有unsigned int
,因此这将获得许多非常低效的副本。我将其更改为mat
,但imat
也应该有效。
b)您使用for(i in 1:100000)
循环很多。我们已经看到了与对象创作的“gazillions”类似的问题。我们不确定错误在哪里。
使用较小的N似乎不会发生(经常)。我们来看看RNGScope
是否与它有关 - 但这是一个非常简单的对象。
感谢错误报告。请考虑下次使用rcpp-devel
。
编辑:另请注意,使用Rcpp
向量时,错误似乎并未表现出来。所以你可以使用两步法首先初始化Rcpp对象,然后从中初始化Armadillo对象 - 包中的fastLm.r
文件有一个例子。
suppressMessages(library(Rcpp))
suppressMessages(library(inline))
useRcpp <- function() {
code_cpp <- '
// From R
NumericVector x0(x0_r);
NumericVector time_vec(time_vec_r);
// Declare variables
NumericMatrix simulation_data(x0.size(), time_vec.size());
RNGScope scope;
return simulation_data;
'
cxxfunction(body = code_cpp,
sig = signature(x0_r = "integer", time_vec_r= "numeric"),
plugin = "Rcpp")
}
gillespie_sim <- useRcpp()
x0 <- c(1,0,0,0,0,0)
time_vec <- 1:800
set.seed(23)
for(i in 1:100000) out2 <- gillespie_sim(x0_r=x0,time_vec_r=time_vec)
cat("Done\n")