Allocation de vecteurs d'armement de taille flexible - vraie en général ou est-ce une propriété de Rcpp ?
-
21-12-2019 - |
Question
J'utilise le package Rcpp pour écrire un code dont la proportion principale est écrite en C++ et la plus petite proportion en R.
D'après ce que je sais du C++, contrairement à R, toutes les variables en C++ doivent être déclarées à l'avance et cette déclaration inclut à la fois le type et la taille.Par exemple quand on dit :
arma::vec test(2);
alors je suppose que test est un vecteur tatou de taille 2, ce qui signifie que nous ne devrions rien attribuer de taille différente à tester.Est-ce correct?
Voici mon défi :
Dans mon code, j'ai une boucle qui attribue des vecteurs de taille différente (généralement supérieure à 2) au "vecteur de test" sans redéclaration de test .A ma grande surprise, le code fonctionne parfaitement sans aucune erreur de compilation !
À chaque itération, voici comment j'attribue un nouveau vecteur à tester :
test = Rcpp::as<arma::vec>(myList["aVecFromMyList"]);
Question:
Est-ce une fonctionnalité d'Armadillo que nous pouvons attribuer à des vecteurs de différentes longueurs pour tester et qui est initialement déclarée comme étant de taille 2 ?ou c'est une fonctionnalité du package Rcpp ?
Merci beaucoup pour votre aide.
La solution
Vous demandez que la taille du vecteur soit codée dans le taper.Lorsque vous spécifiez que quelque chose est de type arma::vec
, vous lui permettez d'accepter arma::vec
s de n’importe quelle taille.
Si vous souhaitez imposer une contrainte de taille dans le type, vous voulez quelque chose comme arma::vec::fixed<N>
, où dans ton cas N
serait 2.C'est un type qui impose la contrainte selon laquelle les vecteurs doivent être de taille N
.Il existe également des typedefs pour les versions à bas chiffres, par ex. vec2
comme vecteur fixe de taille 2.
Il faudrait modifier votre as
appelez de la même manière, je crois - j'espère que cela fonctionne, je ne l'ai pas testé.
Tu devrais lire le Documents sur le tatou;les documents Armadillo sont probablement parmi les plus propres et les plus utiles.