2012-11-10 25 views
5

Tôi có ma trận được định nghĩa trong R. Tôi cần chuyển ma trận này sang hàm C++ và thực hiện các phép toán trong C++. Ví dụ: Trong R, xác định một ma trận,Xác định ma trận trong R và chuyển nó tới C++

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

tôi cần phải vượt qua ma trận này để một hàm C++ nơi biến 'dữ liệu' kiểu vector<vector<double>> sẽ được khởi tạo với ma trận A.

Tôi couldn' t dường như tìm ra cách để làm điều này. Tôi đang suy nghĩ theo cách phức tạp hơn thì tôi nên, tôi cá là có một cách dễ dàng để làm điều này.

+2

Thật là ngu ngốc khi lưu trữ ma trận dưới dạng 'vector >'; vì lợi ích của khả năng đọc tốt hơn bạn có nguy cơ phân mảnh bộ nhớ và phá vỡ tối ưu hóa liên kết. Hơn nữa, cách này bạn sao chép dữ liệu đã có trong bộ nhớ và sẵn sàng sử dụng - đây là một chi phí đáng kể! – mbq

Trả lời

5

Như Paul đã nói, tôi khuyên bạn nên sử dụng Rcpp cho loại điều đó. Nhưng nó cũng phụ thuộc vào những gì bạn muốn vector< vector<double> > của bạn có nghĩa là. Giả sử bạn muốn lưu trữ các cột, bạn có thể xử lý ma trận của mình như sau:

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 thật tuyệt vời :) –

+0

Cảm ơn, tôi sẽ thử! – intsymmetry

+0

Khi bạn đang ở đó. xem xét chấp nhận câu trả lời :-) –

5

Có thể bạn muốn sử dụng Rcpp. Gói này cho phép tích hợp dễ dàng R và C++, bao gồm việc truyền các đối tượng từ R đến C++. Gói này có sẵn trên CRAN. Ngoài ra, một số gói trên CRAN sử dụng Rcpp, vì vậy họ có thể phục vụ như là nguồn cảm hứng. Trang web của Rcpp có tại đây:

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

bao gồm một vài hướng dẫn.

+0

bạn đã nhanh hơn. Tôi cũng sẽ trả lời với một ít thịt. –

+1

Cảm ơn, điều đó sẽ hữu ích cho OP –

Các vấn đề liên quan