2009-09-08 12 views

Répondre

4

Le package plyr fournit un ensemble d'outils généraux pour remplacer les constructions en boucle lorsque vous travaillez avec une structure de données volumineuses en la décomposant en plusieurs parties, en traitant chaque pièce de manière indépendante et en regroupant les résultats.

2

Le premier objectif devrait obtenir de travail code. Tu es là. Ensuite, essayez quelques optimisations simples. Par exemple.

retVal <- matrix(NA, ni, nj)  # assuming your result is scalar 
for (i in 1:ni) 
    for (j in 1:nj) 
     retVal[i][j] <- *some function of yours* 

sera déjà exécuté beaucoup plus vite que vous ne réaffecte pas la mémoire pour chaque i, j combinaison. Pour la boucle, vous pouvez commencer par remplacer la boucle interne par quelque chose de la famille apply. Je ne suis pas au courant de quelque chose de complètement général pour répondre à votre question - cela dépend des arguments que votre fonction prend et du type d'objet de retour qu'elle produit.

+0

Gotcha. Une chose généralisable que je reçois de votre réponse est que préallouer une matrice est une bonne idée lorsque vous avez deux indices sur un vecteur. Une autre idée pourrait être de traverser le vecteur original pour créer une matrice, puis d'utiliser des opérations matricielles pour obtenir une matrice de résultats. –

+0

Oui, il existe de meilleures façons d'indexer directement la matrice (c'est-à-dire deux dim). Juste comment, disons, exponeniate tous les éléments d'une matrice. Mais l'effet de pré-allocation est déjà énorme - j'ai un exemple avec le timing dans mes cours d'introduction à l'informatique haute performance avec R. –