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

标签 c++ r matrix reference rcpp

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

// [[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

最佳答案

此处您提供给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 只是一个身份并返回外部指针,而不是我猜您正在寻找的指针。

关于c++ - 使用 xptr 在内存中存储和检索矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21154003/

相关文章:

R:处理光栅包中的 sf 对象

r - 如何强制 model.matrix/model.Matrix() 保持因子水平的原始顺序......?

python - 运行 theano 时编译失败 - Windows 8.1 64 位与 Anaconda python 发行版

R:如何从一列中创建额外的行?

r - 将社区数据转换为纯素包的宽格式

matlab - 在Matlab中按升序重新排序的位置?

r - 在 R 中用于跟踪矩阵的函数是什么

c++ - Cmake 无法找到请求的 Boost 库。 - boost_coroutine 1.53

c++ - 需要帮助优化绘图代码...

c++ - 错误,动态分配对象到数组