Выпуск Mermory с использованием цикла for в R функции C ++ с использованием Rcpp - PullRequest
0 голосов
/ 06 декабря 2018

что-то непонятное при использовании цикла for с функцией Rcpp.Вот простой пример, который должен помочь:

Это мой код cpp в файле test_cpp.cpp

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::mat test_Cpp(int n,
                   arma::vec my_vec,
                   Rcpp::List my_list,
                   int mat_size,
                   double lambda,
                   double beta) {
  //  Matrix of mat_size rows & mat_size columns (filled with 0)
  arma::mat matrix_out(mat_size, mat_size) ;
  for (int it = 0 ; it < n ; ++it) {
    arma::mat temp_mat_flux_convol = my_list[it] ;
    if (my_vec[it] != 0) {
      matrix_out += lambda * my_vec[it] * beta * temp_mat_flux_convol ;
    }
  }
  return matrix_out ;
 }

Тогда из кода R, почему res1 и res2 отличаются, когдаиспользуется в «бесполезном» для цикла и то же самое без цикла?Я думаю, что есть вещи Segfault, но я не понял!

library(Rcpp)
library(RcppArmadillo)
sourceCpp(file = "src/test_cpp.cpp")
set.seed(123)
ls_rand = lapply(1:10, function(x) matrix(rnorm(9), ncol=3))


for(i in 1:1){
  res1 <- test_Cpp(n = 10,
                my_vec = 1:100,
                my_list = ls_rand,
                mat_size = 3,
                lambda =  24,
                beta = 0.4)

  res2 <- test_Cpp(n = 10,
                my_vec = 1:100,
                my_list = ls_rand,
                mat_size =  3,
                lambda = 24,
                beta = 0.4)
}
all.equal(res1, res2)
res1 ; res2 # here res2 is twice res1 !!!

## Without for loop
res1 <- test_Cpp(n = 10,
                my_vec = 1:100,
                my_list = ls_rand,
                mat_size = 3,
                lambda =  24,
                beta = 0.4)
res2 <- test_Cpp(n = 10,
              my_vec = 1:100,
              my_list = ls_rand,
              mat_size =  3,
              lambda = 24,
              beta = 0.4)

all.equal(res1, res2)
res1 ; res2 # here res1 and res2 are the same!

1 Ответ

0 голосов
/ 06 декабря 2018

Ошибка лежит здесь:

  //  Matrix of mat_size rows & mat_size columns (filled with 0)
  arma::mat matrix_out(mat_size, mat_size) ;

Документация гласит:

mat (n_rows, n_cols) (память не инициализирована)
mat (n_rows, n_cols, fill_type) (память инициализирована)

Так что если вы измените свой код на

  //  Matrix of mat_size rows & mat_size columns (filled with 0)
  arma::mat matrix_out(mat_size, mat_size, arma::fill::zeros) ;

Комментарий на самом деле правильный, и проблема исчезнет.

...