2015-08-31 3 views
2

Я пытаюсь передать вектор bool в качестве аргумента функции, использующей Rcpparmadillo. Глупый пример выглядит следующим образом:Rcpparmadillo C++ create bool vector

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

// [[Rcpp::export]] 
arma::mat myfun(arma::mat A, arma::vec mybool) 
{ 
    int n = A.n_rows; 
    arma::vec B(n); 

    for(unsigned int i = 0; i < n; ++i) 
    { 
     if(mybool.row(i) && i < 10) // mybool.row(i) && throws the error 
     { 
      B.row(i) = arma::accu(A.row(i)); 
     } 
     else 
     { 
      B.row(i) = pow(arma::accu(A.row(i)), 0.5); 
     } 
    } 

    return B; 
} 

Here типа предлагается, но не работает для меня. Я пробовал uvec и std::vector<bool>, но также не работает. Каков наилучший способ передать логический вектор в качестве аргумента, используя Rcpparmadillo?

+0

Попробуйте отформатировать кода более стандартным образом. –

+0

возможно эта помощь: http://stackoverflow.com/questions/18899665/armadillo-c-linear-algebra-library-how-to-create-vector-of-boolean –

+1

Функция члена строки возвращает вектор строки из матрицы , В этом случае у вас есть вектор, поэтому вы хотите, чтобы mybool (i) возвращал элемент с проверкой границ или проверку mybool [i] без ограничений. –

ответ

4

Вы хотите uvec от Armadillo - у него нет модели bool. Вот переформатирован версия кода, который * используется uvec * индексы векторов непосредственно

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

// [[Rcpp::export]] 
arma::mat myfun(arma::mat A, arma::uvec mybool) { 
    unsigned int n = A.n_rows; 
    arma::vec B(n); 
    for (unsigned int i=0; i<n; ++i) { 
     if (mybool[i] && i < 10) { 
      B[i] = arma::accu(A.row(i)) ; 
     } else { 
      B[i] = pow(arma::accu(A.row(i)), 0.5); 
     } 
    } //end loop 
    return B; 
} 

/*** R 
A <- matrix(1:16,4,4) 
mybool <- c(FALSE, TRUE, TRUE, FALSE) 
myfun(A, mybool) 
*/ 

Если sourceCpp() это, он запускает R на дне для нас:

R> sourceCpp("/tmp/ap13.cpp") 

R> A <- matrix(1:16,4,4) 

R> mybool <- c(FALSE, TRUE, TRUE, FALSE) 

R> myfun(A, mybool) 
     [,1] 
[1,] 5.29150 
[2,] 32.00000 
[3,] 36.00000 
[4,] 6.32456 
R> 
+0

Пара очков, чтобы отметить. (1). функция может быть сделана более эффективной, избегая копирования 'A' и' mybook' с самого начала. Это должно быть 'arma :: mat myfun (const arma :: mat & A, const arma :: uvec & mybool)'. (2) Данные в 'A' должны храниться и обрабатываться по столбцам, а не по строкам, так как Armadillo хранит данные в столбце за столбцом. – mtall

+0

@mtall: У вас есть внимательные глаза программиста на C/C++, но я приглашаю вас рассказать об этом. Наши объекты на самом деле являются тонкими прокси-серверами вокруг базовых объектов «SEXP», которые являются указателями. _So нет копий. Теперь вы можете писать через 'const &' too _, но производительность будет (примерно) одинаковой. –

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