2014-12-14 6 views
1

Я использую Rcpp для создания функции, которая принимает матрицу и вектор, и я хотел бы, чтобы оба они были тем же шаблоном. Есть какой-либо способ сделать это? Кажется, что вы должны объявить матрицу как числовую или что-то перед ее использованием.Templated Matrix в 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 атрибуты не обрабатывает экспорт шаблонных функций, так что вы не можете написать:

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

Это происходит потому, что набрав в R является динамическим (сделано и хранятся во время выполнения), что C++ типирование статично (все должно быть известный во время компиляции). Вам необходимо вручную создать мост между динамическим и статическим мирами.

Общим подходом является создание функции шаблона и функции «отправки», например.

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. –

Смежные вопросы