犰狳中的 Rcpp 糖命令
Rcpp sugar commands in armadillo
我正在尝试将 Rcpp 糖的 ifelse()
命令与 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))
*/
这是我找到的解决方案,希望对您有用。
#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
使用 Armadillo 的 advanced constructors 可以让 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% 确定这没有任何不良副作用。
我正在尝试将 Rcpp 糖的 ifelse()
命令与 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))
*/
这是我找到的解决方案,希望对您有用。
#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
使用 Armadillo 的 advanced constructors 可以让 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% 确定这没有任何不良副作用。