2014-01-30 113 views
1

我想更好地瞭解外部工作和如何矢量化函數。以下是我正在嘗試做的一個簡單示例:我有一組數字2,3,4。對於每個組合(a,b)在對角線上創建對角矩陣a a b b b,然後對其進行處理,例如,計算其行列式(這僅用於演示目的)。計算結果應該寫成3乘3的矩陣,每個組合使用一個字段。R:外部,矩陣和向量化

下面的代碼不工作 - 顯然,outer(或my.func)不明白,我不希望被應用於整個lambdas載體 - 你可以看到這種情況,當你取消對print包括命令。

lambdas <- c(1:2) 
my.func <- function(lambda1,lambda2){ 
# print(diag(c(rep(lambda1,2),rep(lambda2,2)))) 
det(diag(c(rep(lambda1,2),rep(lambda2,2)))) 
} 
det.summary <- outer(lambdas,lambdas, FUN="my.func") 

如何我需要修改我的函數或外部通話這樣的事情表現得像我想?

我想我需要以某種方式向量化我的函數,但我不知道如何以及以何種方式對外部調用進行不同的處理。

編輯: 我已經改變了矩陣的大小,使其不那麼混亂。我想生成4乘4矩陣的對角線,用下面的對角線;在括號內的對應參數lambda1, lambda2

1 1 1 1 (1,1)1 1 2 2 (1,2),2 2 1 1 (2,1)2 2 2 2 (2,2)

然後,欲計算它們的決定簇(其在此處任意選擇),並把結果放到一個矩陣,它的第一列對應於lambda1=1,第二至lambda1=2,行對應於lambda2選擇。 det.summary應該是一個2由使用以下值到矩陣:

1 4 
4 16 

因爲這些是上面列出的對角矩陣的決定因素。

+0

我已經讀了幾次,我仍然不知道你想做什麼。你能展示你想要的結果嗎? – thelatemail

+0

混淆不是我的願望。現在更清楚了嗎? – Roland

回答

2

你知道什麼,有一個Vectorize函數(大寫「V」)!

outer(lambdas,lambdas, Vectorize(my.func)) 
#  [,1] [,2] 
# [1,] 1 4 
# [2,] 4 16 

當你想通了(和我花了一段時間才能找出)outer需要將矢量化功能。在某些方面,它與*pply函數相反,它通過依次向操作符/函數提供每個值來有效地矢量化操作。但是這很容易處理,如上所示。

+1

我認爲@ agstudy對我的類似問題的回答應該得到所有的選票。 http://stackoverflow.com/questions/18110397/why-doesnt-outer-work-the-way-i-think-it-should-in-r –

+0

@IShouldBuyABoat,有趣的是,我最終通過我自己瞭解了這一點像他一樣使用'browser()'。我們似乎得出了類似的結論,儘管我不清楚在這裏是否存在某種不同意見,或者您是否指向其他資源。 – BrodieG

+0

只要指出這是重複的,正確的迴應是將檢查應用於舊的答案。你還沒有完成。 –