2012-11-10 5 views
5

행렬이 R로 정의됩니다.이 행렬을 C++ 함수에 전달하고 C++에서 연산을 수행해야합니다. 예 : R에서, I는 I '가 나오지 않았어R에 행렬을 정의하고 C++에 전달

vector<vector<double>>의 변수'데이터 '매트릭스 A.로 초기화하는 C++ 기능이 매트릭스를 전달할 필요

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

을 행렬을 정의 어떻게하는지 알아낼 것 같습니다. 나는 더 복잡한 방법으로 생각하고있다. 나는 이것을 할 수있는 쉬운 방법이 있다고 생각한다.

+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에 도움이 될 것입니다 –