2011-10-28 6 views
6

Co doświadczeni programiści R uznaliby za najbardziej wydajny (ale wciąż możliwy do odczytania) sposób konstruowania macierzy o danej liczbie wierszy i kolumn z danej funkcji, na przykład A_ij = someFun (i, j) z 1 < = i < = wiersze, 1 < = j < = cols?Skutecznie utworzyć macierz z wartości funkcji

Ponieważ nie mogłem znaleźć coś w dokumentacji wymyśliłem

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

który wydaje się głupie i powoli do mnie. Wszelkie ulepszenia (szczególnie jednolinijkowe) mile widziane! :)

Odpowiedz

7

Myślę, że szukasz outer(seq(rows),seq(cols),fn) (lub jak sugerowano poniżej, outer(seq_len(rows),seq_len(cols),fn): potrzebowałbym kilku przykładów, aby zobaczyć, jak dużą różnicę spowodowało).

Możesz dużo zyskać na czytelności (przynajmniej, jeśli nie musisz sprawdzać, co się dzieje) w ten sposób, ale nie sądzę, że oszczędzasz dużo czasu. Coś sprytniejszego i bardziej wydajnego może być możliwe, jeśli twoje fn jest wektoryzowane na początek: czy to prawda?

+1

Albo z 'seq_len' zamiast' seq'. –

+0

Dziękuję za odpowiedź na to pytanie tak szybko! O ile wektoryzacja $ fn $ dotyczy ... niestety nie. Jak można się domyślić, jestem całkiem nowy dla R (jestem przyzwyczajony do numpy/scipy, klon i tym podobne), dlatego nie odkryłem jeszcze jak wektoryzować funkcji. – fotNelton

6

spojrzeć 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"