2012-11-10 20 views
5

我在R.限定的矩陣我需要這個矩陣傳遞給一個C++函數和用C做操作++。 示例:在R,定義一個矩陣,R中定義的矩陣,並將它傳遞到C++

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

我需要這個矩陣傳遞給一個C++函數,其中vector<vector<double>>類型的變量「數據」將與矩陣A.

我不能」被初始化t似乎弄清楚如何做到這一點。我以更復雜的方式思考我應該如何,我敢打賭,有一個簡單的方法可以做到這一點。

+2

這是非常愚蠢的存儲矩陣,向量'<矢量>';爲了提高可讀性,可能會導致內存碎片和對齊優化中斷。而且,通過這種方式,您可以複製已經存在於內存中的數據,並隨時可以使用 - 這是一項重要的開銷! – mbq

回答

5

正如Paul所說,我會推薦使用Rcpp來處理那種事情。但這也取決於你想要什麼vector< vector<double> >。假設你要存儲的列,你可能會處理您的矩陣是這樣的:

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是真棒:) –

+0

謝謝,我會努力的! – intsymmetry

+0

當你在這裏。考慮接受答案:-) –

5

你可能想使用RCPP。此包允許輕鬆地整合R和C++,包括將對象從R傳遞到C++。該套件在CRAN上提供。另外,CRAN上的一些軟件包使用Rcpp,因此它們可以作爲靈感。 RCPP的網站是在這裏:

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

,其中包括一些教程。

+0

你已經更快了。我也會回答一些肉。 –

+1

謝謝,那將是對OP有用 –