小编Cur*_*rge的帖子

使用xptr在内存中存储和检索矩阵

我希望能够将R中创建的矩阵存储在内存中并返回指针.然后使用指针从内存中取回矩阵.我正在运行R版本3.0.1(2013-05-16) - Ubuntu 13.01上的"Good Sport"和Rcpp版本"0.10.6".我试过了 ...

// [[Rcpp::export]]
SEXP writeMemObject(NumericMatrix mat)
{
  XPtr<NumericMatrix> ptr(&mat, true);
  return ptr;
}

// [[Rcpp::export]]
NumericMatrix getMemObject(SEXP ptr)
{
  XPtr<NumericMatrix> out(ptr);
  return wrap(out);
}

# This returns a pointer
x <- writeMemObject(matrix(1.0))
Run Code Online (Sandbox Code Playgroud)

但是当我再次尝试时,这会失败并且崩溃R.

getMemObject(x)
Error: not compatible with REALSXP
Run Code Online (Sandbox Code Playgroud)

c++ r reference matrix rcpp

8
推荐指数
1
解决办法
424
查看次数

在RCpp中完成或销毁内存中的xptr矩阵

这是一个跟进到先前的问题在这里存储和使用XPTR在内存中检索矩阵-这是飞驰的回答-非常感谢你.现在我可以使用xptr在内存中创建和检索矩阵如何正确地完成/销毁对象.Rcpp对象应该在删除时自动进行垃圾收集,但是当我创建指针时,如果我在RI中删除它必须运行gc()两次以恢复内存,例如

// This function wraps the matrix an returns a pointer
// [[Rcpp::export]]
SEXP writeMemObject(NumericMatrix mat)
{
  XPtr<NumericMatrix> ptr(new NumericMatrix(mat), true);
  return ptr;
}
Run Code Online (Sandbox Code Playgroud)

检索矩阵的函数(从上一个答案)

// [[Rcpp::export]]
NumericMatrix getMemObject(SEXP ptr)
{
  XPtr<NumericMatrix> out(ptr);
  return *out;
}
Run Code Online (Sandbox Code Playgroud)

然后在R

createMemMatrix <- function(dims){
  ptr <- writeMemObject(matrix(runif(prod(dims)), nc = dims[2]))
  return(ptr)
}

ptr <- createMemMatrix(c(1e4, 1e4))
#mat <- getMemObject(ptr) # this works but not run here
rm(ptr);
gc(); # nothing seems to happen in memory
gc(); # memory is freed (visible in …
Run Code Online (Sandbox Code Playgroud)

c++ memory r matrix rcpp

3
推荐指数
1
解决办法
1107
查看次数

标签 统计

c++ ×2

matrix ×2

r ×2

rcpp ×2

memory ×1

reference ×1