Почему оператор '&' не работает в RcppArmadillo - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь получить логический вектор из двух других логических векторов, соединенных поэлементно '&':

//[[Rcpp::export]]
arma::uvec test1(arma::vec t1, double R1, double R2){
arma::uvec t = (t1 >= R1) & (t1 < R2);
return t;
}

При попытке откомпилировать

error: no match for 'operator&' (operand types are 'arma::enable_if2<true, const arma::mtOp<unsigned int, arma::Col<double>, arma::op_rel_gteq_post> >::result {aka const arma::mtOp<unsigned int, arma::Col<double>, arma::op_rel_gteq_post>}' and 'arma::enable_if2<true, const arma::mtOp<unsigned int, arma::Col<double>, arma::op_rel_lt_post> >::result {aka const arma::mtOp<unsigned int, arma::Col<double>, arma::op_rel_lt_post>}')
arma::uvec t = (t1 >= R1) & (t1 < R2);
                          ^
* 1006 возвращается следующая ошибкаЯ понятия не имею, что происходит.Я предполагаю, что Armadillo делает вещи по-другому.Но я не могу найти никаких источников, которые бы помогли мне разобраться.Любая помощь будет оценена!Большое спасибо!

1 Ответ

3 голосов
/ 28 сентября 2019

Понятия не имею, что происходит.Я предполагаю, что Armadillo делает вещи по-другому.Но я не могу найти источники, которые могли бы помочь мне разобраться.

Конечный источник здесь - Документы Armadillo .Если вы перейдете к разделу об операторах , вы увидите, что оператор & не входит в число перечисленных среди операторов "[o] verloaded для Mat, Col, Row и Cube классы. "Так что, если вы хотите такого оператора, вам придется самостоятельно его кодировать (или посмотреть, есть ли у кого-то еще его в интернете).Для Rcpp::NumericVector s есть такой оператор:

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::LogicalVector test1(const Rcpp::NumericVector& t1, double R1, double R2){
    return (t1 >= R1) & (t1 < R2);
}
test1(1:10, 3, 7)
# [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
# [9] FALSE FALSE

Конечно, это мало поможет, если весь ваш код действительно полагается на Armadillo.

Обновление: Просто используйте &&

Как указано mtall в комментариях, оператор && на самом деле доступен , даже если он не обсуждался в броненосцеdocs (возможно, это не такой исходный код, как я думал)на основании вашего вопроса и ответа на комментарии:

test1(1:10, 3, 7)
      [,1]
 [1,]    0
 [2,]    0
 [3,]    1
 [4,]    1
 [5,]    1
 [6,]    1
 [7,]    0
 [8,]    0
 [9,]    0
[10,]    0
...