2

我一直在使用 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 中设置断点以调试 Abort 陷阱:6

4

1 回答 1

0

嗯,我看到两个问题:

a) 你使用umat,但我们unsigned int在 R 中没有,所以这会得到很多非常低效的副本。我将其更改为mat,但imat也应该可以工作。

b )你循环很多for(i in 1:100000)我们已经看到与“数以千计”的对象创建类似的问题。我们不确定错误在哪里。

使用较小的 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")
于 2013-03-03T13:19:29.300 回答