2014-12-14 2 views
1

매트릭스와 벡터를 취하는 함수를 만들기 위해 Rcpp를 사용하고 있습니다. 둘 다 같은 템플릿 유형이되고 싶습니다. 이 작업을 수행 할 여지가 있습니까? 행렬을 사용하기 전에 행렬을 숫자로 선언해야하는 것처럼 보입니다.RCPP의 템플릿 된 매트릭스

//[[Rcpp::export]] 
void MyFunc(Matrix<T> templated_matrix, std::vector<T> set_row) 
{ 
    templated_matrix(0, _) = row; 
} 
+0

질문의 모호성에 대해 사과드립니다. 이것은 아마도 사람들이 루프를 던져 버릴 정도로 간단 할 것입니다. 그리고 저는 템플릿 기반 행렬을 얻는 방법에 대해 대부분 궁금합니다. 일부 코드가 추가되었습니다. – Coat

+0

업데이트를 통해 질문에 적절하게 답변 할 수 있다고 생각합니다. –

+1

동의 함, @KevinUshey. 외부의 일반적인 템플리트처럼 보이지만 C가 C로되어 있기 때문에 내부에서 다이나믹하게 디스패치하고 R은 R에서 완료됩니다. –

답변

5

여기에 몇 가지 문제가 있습니다.

// [[Rcpp::export]] 
template <typename T> 
void MyFunc(T object) { ... } 

을 R을 입력하면 입력이 정적 인 C++ (수행 및 런타임에 저장), 동적 때문 (모든해야한다 : 당신이 쓸 수 있도록 특히, Rcpp는 템플릿 함수의 수출 처리하지 않는 속성 컴파일 타임에 알려짐). 동적 인 세계와 정적 인 세계 사이에 다리를 수동으로 생성해야합니다.

일반적인 접근법은 템플릿 함수와 '디스패치'함수를 만드는 것입니다.

template <typename T> 
void MyFuncImpl(T object) { .... } 

// [[Rcpp::export]] 
void MyFunc(SEXP object) 
{ 
    switch (TYPEOF(object)) 
    { 
    case INTSXP: return MyFuncImpl<IntegerVector>(object); 
    case REALSXP: return MyFuncImpl<NumericVector>(object); 
    ... 
    } 
} 

귀하의 경우 전달 된 객체가 행렬인지 여부 (예 : 행렬)에 따라 발송물을 분리해야 할 수도 있습니다. if (Rf_isMatrix(object)) { ... } else { .... }.

당신은 Rcpp gallery 도움이 이러한 기사를 찾을 수 있습니다으로

제쳐두고 - 당신은 R 객체의 기본 유형에 직접 템플릿을하려는 경우, 다음과 같이 쓸 수도 있습니다 :

template <int RTYPE> 
void MyFuncImpl(Vector<RTYPE> object) { .... } 

당신의 필요에 따라 더 유용 할 수도 있고 그렇지 않을 수도 있습니다.

+0

아주 좋은 대답입니다 + 1'ed. –