Rcpp sugar commands in armadillo

倾然丶 夕夏残阳落幕 提交于 2020-01-30 08:59:04

问题


I'm trying to use ifelse() command of Rcpp sugar with arma::vec. The code fails with error

'ifelse' was not declared in this scope

I could not find a solution. A simple example code (resulted with error) is below.

#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))
*/

回答1:


Using Armadillo's advanced constructors you can have Rcpp::NumericVector and arma::vec that refer to the same memory location. Then you can use both Rcpp functions and arma functions by using the correct front-end object for that piece of memory:

#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))
*/

I am not 100% sure that this does not have any unwanted side-effects.




回答2:


This is the solution that I found I hope will work for you.

#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;
}

The output is

/*** R
f(c(1,2,3),c(3,2,1))
*/
     [,1]
[1,]    8


来源:https://stackoverflow.com/questions/51552149/rcpp-sugar-commands-in-armadillo

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!