2014-06-16 7 views
0

Débutant à Rcpp ici. J'ai une liste de vecteur de vecteurs en C++, où je suis en utilisant le vecteur de vecteurs pour représenter une matrice, par exemple de la taille Mi x N, où i est de 1 to K et K est le nombre d'éléments de la liste:comment puis-je convertir vecteur de vecteur comme matrice dans R en utilisant Rcpp

std::map<double, vector<vector<double> > x; 

En variante, pour l'élément 1 de la liste, le vecteur de vecteur est de dimensions M1 x N, pour l'élément 2 de la liste, le vecteur de vecteur est de dimensions M2 x N, ..., le vecteur de vecteur est de dimensions MK x N pour élément K de la liste.

Comment puis-je convertir en une liste de matrices dans R. Si je tente:

return wrap(x) 

Je reçois une liste de la liste des vecteurs, pas la liste des matrices.

Voici un exemple échantillon, où x en C++ est:

1st element of map: 
    within that, element of the 1st vector: 1 1 1 1 
       element of the 2nd vector: 1 1 1 1 
       element of the 3rd vector: 2 2 2 2 
       element of the 4th vector: 3 3 3 3 
2nd element of map: 
    within that, element of the 1st vector: 4 4 4 4 
       element of the 2nd vector: 3 3 3 3 
       element of the 3rd vector: 2 2 2 2 
       element of the 4th vector: 5 5 5 5 
       element of the 5th vector: 1 1 1 1 

Si j'essaie return wrap(x) je reçois dans R (ps indentation ajouté ci-dessous pour rendre la sortie de R plus claire):

$`1` 
    $`1`[[1]] 
    [1] 1 1 1 1 

    $`1`[[2]] 
    [1] 1 1 1 1 

    $`1`[[3]] 
    [1] 2 2 2 2 

    $`1`[[4]] 
    [1] 3 3 3 3 

$`2` 
    $`2`[[1]] 
    [1] 4 4 4 4 

    $`2`[[2]] 
    [1] 3 3 3 3 

    $`2`[[3]] 
    [1] 2 2 2 2 

    $`2`[[4]] 
    [1] 5 5 5 5 

    $`2`[[5]] 
    [1] 1 1 1 1 

Ce que je veux être retourné dans R est:

$`1` 
     [,1] [,2] [,3] [,4] 
    [1,] 1 1 1 1 
    [2,] 1 1 1 1 
    [3,] 2 2 2 2 
    [4,] 3 3 3 3 

    $`2` 
     [,1] [,2] [,3] [,4] 
    [1,] 4 4 4 4 
    [2,] 3 3 3 3 
    [3,] 2 2 2 2 
    [4,] 5 5 5 5 
    [5,] 1 1 1 1 

serait le moyen le plus efficace de le faire dans RCpp?

Répondre

1

vector<vector<>> ne contient pas d'informations de rectangularité. Je vous recommande d'avoir votre propre classe MyMatrixClass ou autre, qui pourrait très bien contenir un vector<vector<>> si vous le souhaitez.

Mais vous définissez MyMatrixClass::operator SEXP() afin qu'il soit converti à la structure appropriée. Vous pouvez tirer parti de la classe NumericMatrix par exemple. Il fait de son mieux avec les informations qu'il possède au moment de la compilation, et il ne sait pas que tous les vecteurs auront la même taille, donc le mieux qu'il peut faire est de faire une liste de vecteurs numériques.

2

C'est votre choix de conception: J'utilise le vecteur de vecteurs pour représenter une matrice. Alors peut-être que vous devez vous écrire un convertisseur. Comme vous êtes une affiche relativement fréquente ici, vous savez maintenant que nous avons une documentation sur la façon d'écrire votre propre fonction wrap() dans la vignette Rcpp-extending.

Si vous voulez éviter cela, ma suggestion serait d'utiliser réellement une classe de matrice quand vous avez besoin d'une matrice. Rcpp en a un dans NumericMatrix. RcppArmadillo et RcppEigen apportent le leur avec un accent supplémentaire sur l'algèbre matricielle.

Pour moi, RcppArmadillo offre une combinaison parfaite de fonctionnalités et de facilité d'utilisation. Il vous permet également d'écrire du code qui ne dépend que des en-têtes Armadillo si vous voulez réutiliser le code C++ en dehors de R, mais ensuite le connecter très simplement à R grâce à Rcpp/RcppArmadillo.

Questions connexes