2011-10-28 10 views
6

Lo que los desarrolladores de R con experiencia considerarían la forma más eficiente (pero aún legible) de construir una matriz con un número dado de filas y columnas de una función dada, como p. A_ij = someFun (i, j) con 1 < = i < = filas, 1 < = j < = cols?Cree eficientemente una matriz a partir de los valores de función

Como no podía encontrar algo en la documentación que se me ocurrió

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) 
} 

que parece tonto y lento para mí. ¡Cualquier mejora (particularmente de una sola línea) bienvenida! :)

Respuesta

7

Creo que estás buscando outer(seq(rows),seq(cols),fn) (o como se sugiere a continuación, outer(seq_len(rows),seq_len(cols),fn): necesitaría algunos ejemplos para ver la diferencia que hace).

Puede ganar mucho en legibilidad (al menos si no tiene que ir a buscar ?outer para averiguar qué está pasando) de esta manera, pero en realidad no creo que ahorre mucho tiempo. Algo más inteligente y más eficiente podría ser posible si su vector fn está vectorizado para empezar: ¿verdad?

+1

O con '' seq_len' en lugar de seq'. –

+0

¡Gracias por su respuesta tan rápido! En lo que se refiere a la vectorización de $ fn $ ... desafortunadamente no. Como se puede adivinar, soy bastante nuevo en R (estoy acostumbrado a numpy/scipy, maple, etc.) y por eso aún no he descubierto cómo vectorizar las funciones. – fotNelton

6

echar un vistazo a 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" 
Cuestiones relacionadas