2012-11-10 3 views
5

Ich habe eine Matrix in R. I definiert brauche diese Matrix auf einem C++ Funktion zu passieren und zu tun Operationen in C++. Beispiel: In R, definiert eine Matrix,eine Matrix in R und übergibt es an C++

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

Ich brauche diese Matrix auf eine C passieren ++ Funktion wo variable 'Daten' des Typs vector<vector<double>> werden mit der Matrix A. initialisiert werden

I ‚couldn Es scheint, als würden Sie herausfinden, wie das geht. Ich denke komplizierter als ich sein sollte, ich wette, es gibt einen einfachen Weg, dies zu tun.

+2

Es ist ziemlich dumm zu speichern Matrizen als 'vector >'; Aus Gründen der deutlich besseren Lesbarkeit riskieren Sie eine Speicherfragmentierung und eine Unterbrechung der Ausrichtungsoptimierung. Auf diese Weise kopieren Sie Daten, die bereits im Speicher vorhanden und einsatzbereit sind - das ist ein erheblicher Mehraufwand! – mbq

Antwort

5

Wie Paulus sagte, würde ich für diese Art von Dingen, mit Rcpp empfehlen. Aber es kommt auch darauf an, was du von deiner vector< vector<double> > meinen willst. Angenommen, Sie möchten Spalten speichern, können Sie Ihre Matrix wie dieser Prozess könnte:

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 ist genial :) –

+0

Danke, ich werde es versuchen! – intsymmetry

+0

Während du schon dabei bist. Wir haben auch zahlreiche Beispiele in der RCPP Dokumentation betrachten die Antwort :-) –

5

Sie möchten wahrscheinlich Rcpp verwenden. Dieses Paket ermöglicht die einfache Integration von R und C++, einschließlich der Übergabe von Objekten von R an C++. Das Paket ist auf CRAN verfügbar. Darüber hinaus verwenden einige Pakete auf CRAN Rcpp, so dass sie als Inspiration dienen können. Die Website von RCPP ist hier:

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

, die ein paar Tutorials enthält.

+0

Sie waren schneller. Ich werde auch mit etwas Fleisch antworten. –

+1

Danke, das wäre hilfreich für die OP –