2011-10-28 21 views
6

Ciò che gli sviluppatori R esperti dovrebbero considerare il modo più efficiente (ma ancora leggibile) per costruire una matrice con un numero dato di righe e colonne da una funzione data, ad esempio ad es. A_ij = someFun (i, j) con 1 < = i < = righe, 1 < = j < = cols?Creare in modo efficiente una matrice dai valori di funzione

Dal momento che non riuscivo a trovare qualcosa nella documentazione che mi è venuta

initMatrix <- function(rows, cols, fn) { 
    A <- matrix(nrow=rows, ncol=cols) 
    for (i in 1:rows) 
     for (j in 1:cols) 
      A[i,j] <- fn(i,j) 
    return(A) 
} 

che sembra stupido e lento per me. Qualsiasi miglioramento (in particolare one-liner) benvenuto! :)

risposta

7

Penso che stiate cercando outer(seq(rows),seq(cols),fn) (o come suggerito sotto, outer(seq_len(rows),seq_len(cols),fn): avrebbero bisogno di alcuni esempi per vedere quanta differenza ha fatto).

È possibile ottenere molto in termini di leggibilità (almeno se non è necessario andare a cercare ?outer per scoprire cosa sta succedendo) in questo modo, ma in realtà non penso che si risparmia molto tempo. Qualcosa di più intelligente e più efficiente potrebbe essere possibile se il tuo fn è vettorizzato per cominciare: vero?

+1

O con 'seq_len' piuttosto che' seq'. –

+0

Grazie per aver risposto così velocemente! Per quanto riguarda la vettorizzazione di $ fn $, sfortunatamente no. Come puoi immaginare, sono abbastanza nuovo per R (sono abituato a numpy/scipy, acero e simili) ed è per questo che non ho ancora trovato il modo di vettorializzare le funzioni. – fotNelton

6

uno sguardo alla outer:

> outer (LETTERS [1:3], letters [4:7], paste) 
    [,1] [,2] [,3] [,4] 
[1,] "A d" "A e" "A f" "A g" 
[2,] "B d" "B e" "B f" "B g" 
[3,] "C d" "C e" "C f" "C g" 
Problemi correlati