2012-11-10 10 views
5

Ho una matrice definita in R. Ho bisogno di passare questa matrice a una funzione C++ e fare operazioni in C++. Esempio: In R, definire una matrice,Definire una matrice in R e passarla a C++

A <- matrix(c(9,3,1,6),2,2,byrow=T) 
PROTECT(A = AS_NUMERIC(A)); 
double* p_A = NUMERIC_POINTER(A); 

devo passare questa matrice a una funzione C++ dove verrà inizializzata variabile 'dati' di tipo vector<vector<double>> con la matrice A.

couldn' t sembra capire come fare questo. Sto pensando in un modo più complicato, quindi dovrei esserlo, scommetto che c'è un modo semplice per farlo.

+2

E 'abbastanza stupido per memorizzare matrici come 'vettore >'; per motivi di leggibilità discutibilmente migliore, si rischia la frammentazione della memoria e la rottura dell'ottimizzazione dell'allineamento. Inoltre, in questo modo copi i dati che sono già presenti in memoria e pronti per l'uso - questo è un overhead significativo! – mbq

risposta

5

Come ha detto Paul, mi consiglia di utilizzare Rcpp per questo tipo di cose. Ma dipende anche da cosa vuoi che il tuo vector< vector<double> > significhi. Supponendo che si desidera memorizzare le colonne, si potrebbe elaborare la matrice in questo modo:

require(Rcpp) 
require(inline) 

fx <- cxxfunction(signature(x_ = "matrix"), ' 
    NumericMatrix x(x_) ; 
    int nr = x.nrow(), nc = x.ncol() ; 
    std::vector< std::vector<double> > vec(nc) ; 
    for(int i=0; i<nc; i++){ 
     NumericMatrix::Column col = x(_,i) ; 
     vec[i].assign(col.begin() , col.end()) ; 
    } 
    // now do whatever with it 
    // for show here is how Rcpp::wrap can wrap vector<vector<> > 
    // back to R as a list of numeric vectors 
    return wrap(vec) ; 
', plugin = "Rcpp") 
fx(A) 
# [[1]] 
# [1] 9 1 
# 
# [[2]] 
# [1] 3 6  
+3

Rcpp è fantastico :) –

+0

Grazie, ci proverò! – intsymmetry

+0

Mentre ci sei. considera di accettare la risposta :-) –

5

Probabilmente si desidera utilizzare Rcpp. Questo pacchetto consente una facile integrazione di R e C++, incluso il passaggio di oggetti da R a C++. Il pacchetto è disponibile su CRAN. Inoltre, un certo numero di pacchetti su CRAN utilizzano Rcpp, in modo che possano fungere da ispirazione. Il sito web di Rcpp è qui:

http://dirk.eddelbuettel.com/code/rcpp.html

che include un qualche tutorial.

+0

sei stato più veloce. Risponderò anch'io con un po 'di carne. –

+1

Grazie, sarebbe utile per l'OP –

Problemi correlati