2011-10-28 61 views
6

什麼是經驗豐富的R開發人員認爲用給定函數構造具有給定行數和列數的矩陣的最有效(但仍然可讀)方式,例如, A_ij = someFun(i,j)1 < = i < =行,1 < = j < = cols?從函數值有效地創建矩陣

因爲我無法找到的文檔中的東西,我想出了

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

這似乎是愚蠢的,慢慢的我。任何改進(特別是單線)歡迎! :)

回答

7

我認爲你正在尋找outer(seq(rows),seq(cols),fn)(或如下建議,outer(seq_len(rows),seq_len(cols),fn):將需要一些例子,看看有多少差異)。

這樣你可以獲得很多的可讀性(至少如果你不需要去查找?outer找出發生了什麼),但我其實並不認爲你節省了很多時間。如果你的fn是矢量化的,那麼更聰明一些,更高效的可能是可能的:是嗎?

+1

或者用'seq_len'而不是'seq'。 –

+0

謝謝你這麼快回答這個問題!就$ fn $的矢量化而言......不幸的是不是。正如你可能猜測我對R相當陌生(我習慣於numpy/scipy,楓等等),這就是爲什麼我還沒有發現如何對函數進行矢量化的原因。 – fotNelton

6

看看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"