c++ - tipos - almacenar y recuperar matrices en memoria usando xptr
punteros y matrices en c (2)
El puntero que alimenta a XPtr
aquí es la dirección de una variable que es local para writeMemObject
. Es muy natural que tengas un comportamiento indefinido.
Además, los punteros externos se utilizan normalmente para objetos que no son objetos R, y una NumericMatrix
es un objeto R, por lo que se ve mal.
Sin embargo, si por alguna razón realmente quieres un puntero externo a una NumericMatrix
entonces podrías hacer algo como esto:
#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 ;
}
Por lo tanto, el puntero creado por new
sale del alcance de la función writeMemObject
.
Además, vea los cambios en getMemObject
, en su versión que tenía:
XPtr<NumericMatrix> out(ptr);
return wrap(out);
No está desreferenciando el puntero, wrap
sería solo una identidad y devolvería el puntero externo en lugar del puntero que supongo que estaba buscando.
Me gustaría poder almacenar una matriz creada en R en la memoria y devolver el puntero. Y luego use el puntero para recuperar la matriz de la memoria. Estoy ejecutando la R versión 3.0.1 (2013-05-16) - "Good Sport" en Ubuntu 13.01 y la versión de Rcpp "0.10.6". Yo he tratado ...
// [[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))
Pero esto falla y se bloquea R cuando lo intento de nuevo
getMemObject(x)
Error: not compatible with REALSXP
Lo que describes es más o menos el caso de uso para el paquete bigmemory . Michael Kane escribió un buen artículo de la Galería Rcpp sobre su uso con Rcpp, que debería abordar sus preguntas.