Команды RCPP сахара в броненосце

Я пытаюсь использовать ifelse() Команда RCPP сахара с arma::vec, Код не работает с ошибкой

'ifelse' was not declared in this scope

Я не мог найти решение. Простой пример кода (приведенный с ошибкой) приведен ниже.

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
arma::vec f(arma::vec x, arma::vec y) {
  arma::vec res1 = Rcpp::ifelse(x < y, x, y);
  arma::vec res = trans(res1)*y;
  return res;
}

/*** R
f(c(1,2,3),c(3,2,1))
*/

2 ответа

Решение

Используя продвинутые конструкторы Armadillo вы можете иметь Rcpp::NumericVector а также arma::vec которые относятся к той же ячейке памяти. Тогда вы можете использовать оба Rcpp функции и arma функции, используя правильный объект переднего плана для этой части памяти:

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
arma::vec f(Rcpp::NumericVector xr, Rcpp::NumericVector yr) {
  arma::vec x(xr.begin(), xr.size(), false, true); 
  arma::vec y(yr.begin(), yr.size(), false, true);
  Rcpp::NumericVector res1r(xr.size());
  arma::vec res1(res1r.begin(), res1r.size(), false, true);  
  res1r = Rcpp::ifelse(xr < yr, xr, yr);
  arma::vec res = trans(res1)*y;
  return res;
}

/*** R
f(c(1,2,3),c(3,2,1))
*/

Я не уверен на 100%, что у этого нет никаких нежелательных побочных эффектов.

Это решение, которое я нашел, я надеюсь, что будет работать для вас.

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]

arma::vec f(arma::vec x, arma::vec y) {
  int n = x.size();
  arma::vec res(n); 
    for(int i = 0; i < n; i++){
      if (x[i] < y[i]){res[i] = x[i];} else{res[i] = y[i];}
  }
  return trans(res)*y;
}

Выход

/*** R
f(c(1,2,3),c(3,2,1))
*/
     [,1]
[1,]    8
Другие вопросы по тегам