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

时间:2014-01-16 05:28:26

标签: c++ r matrix reference rcpp

我希望能够将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))

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

getMemObject(x)
Error: not compatible with REALSXP

2 个答案:

答案 0 :(得分:4)

此处提供给XPtr的指针是writeMemObject本地变量的地址。很自然,你有不确定的行为。

此外,外部指针通常用于非R对象的事物,NumericMatrix是R对象,因此看起来不对。

但是,如果由于某种原因你真的想要一个指向NumericMatrix的外部指针,那么你可以这样做:

#include <Rcpp.h>
using namespace Rcpp ;

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

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

因此new创建的指针比writeMemObject函数的范围更长。

此外,请在您的版本中查看getMemObject中的更改:

XPtr<NumericMatrix> out(ptr);
return wrap(out);

你没有取消引用指针,wrap只是一个身份并返回外部指针,而不是我想你正在寻找的指针。

答案 1 :(得分:2)

您所描述的几乎是bigmemory包的用例。 Michael Kane写了一篇关于它与Rcpp一起使用的nice Rcpp Gallery article,它可以解决你的问题。