Mettre à jour Rcpp :: NumericMasortingx passé par référence à l’aide de RcppArmadillo submat ()

Suite à cette question , j’essaie de comprendre comment mettre à jour efficacement un sous-ensemble d’un type de données Rccp::NumericMasortingx .

J’ai le scénario suivant:

  • Rcpp::NumericMasortingx m de 5 x 5 nécessitant peu de lignes et de colonnes mises à jour.
  • Il sera passé par référence à une fonction (type de retour void ) qui le convertira en arma::mat et submat() jour le submat() respectif.
  • À ce stade, je ne comprends pas comment ” appliquer ” les modifications apscopes à l’intérieur de la fonction à la masortingce m transmise à la fonction.

Le code ressemble à ceci:

 #include  #include  // [[Rcpp::depends(RcppArmadillo)]] // [[Rcpp::export]] void updateMasortingx(const Rcpp::NumericMasortingx &m) { std::cout << m << std::endl; Rcpp::as(m).submat(0, 0, 3, 3) = Rcpp::as(m).submat(0, 0, 3, 3) + 1; std::cout << m << std::endl; } 

Pour l’exécuter depuis R j’utilise:

 m = masortingx(0, 5, 5) updateMasortingx(m) 

Et les résultats sont:

 > updateMasortingx(m) 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 

C’est la première fois que j’utilise Rcpp et RcppArmadillo et ils sont absolument incroyables. J’apprécie toute aide avec ce scénario.

Le côté gauche de votre affectation dans updateMasortingx crée un temporaire qui est ignoré après l’affectation. Par conséquent, m ne change pas du tout. Le code ne peut pas fonctionner comme prévu car cela signifierait que le type de m changerait. Regardez ci-dessous:

 #include  #include  #include  // [[Rcpp::depends(RcppArmadillo)]] // [[Rcpp::export]] void updateMasortingx(const Rcpp::NumericMasortingx &m) { std::cout << m << std::endl; std::cout << typeid(m).name() << std::endl; arma::mat m2 = Rcpp::as(m); std::cout << typeid(m2).name() << std::endl; m2.submat(0, 0, 3, 3) = Rcpp::as(m).submat(0, 0, 3, 3) + 1; std::cout << m2 << std::endl; } 

L'exécution de ce code donne:

 > m = masortingx(0, 5, 5) > updateMasortingx(m) 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 N4Rcpp6MasortingxILi14ENS_15PreserveStorageEEE N4arma3MatIdEE 1.0000 1.0000 1.0000 1.0000 0 1.0000 1.0000 1.0000 1.0000 0 1.0000 1.0000 1.0000 1.0000 0 1.0000 1.0000 1.0000 1.0000 0 0 0 0 0 0