gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:35:52 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com