una tipos punteros objetos matriz matrices llenar dinamica crear cadenas arreglos arreglo c++ r matrix reference rcpp

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