2012-04-16 72 views
0

對於輸入向量執行下面的函數時,我發現結果不一致。看來在使用向量化輸入時,輸出列會重新排序。有沒有更好的方法來矢量化這個功能?陣列函數對輸出列進行錯誤重新排序

func <- function(t, alpha) { exp(matrix(-rep(t,7), ncol=7)*1:7*alpha) } 

# correct  
rbind(func(3, 0.02), func(4, 0.02)) 

#incorrect 
func(c(3, 4), 0.02) 

> rbind(func(3, 0.02), func(4, 0.02)) 
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7] 
[1,] 0.9417645 0.8869204 0.8352702 0.7866279 0.7408182 0.6976763 0.6570468 
[2,] 0.9231163 0.8521438 0.7866279 0.7261490 0.6703200 0.6187834 0.5712091 

> func(c(3, 4), 0.02) 
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7] 
[1,] 0.9417645 0.8352702 0.7408182 0.6570468 0.8869204 0.7866279 0.6976763 
[2,] 0.8521438 0.7261490 0.6187834 0.9231163 0.7866279 0.6703200 0.5712091 

回答

2

沒有什麼不正確或不一致的有關結果,只有你討論R的循環規律的認識,如何元素乘元素操作應用。 ;-)

R存儲並按列主要順序(包括回收規則)對對象進行操作。你的例子只有在R是行主要訂單時纔會起作用。列優先排序裝置matrix(-rep(t,7), ncol=7)*1:7產生類似的結果:

3*1 3*3 3*5 3*7 3*2 3*4 3*6 
4*2 4*4 4*6 4*1 4*3 4*5 4*7 

這是因爲,在內部,矩陣僅僅是一個dim屬性向量。你可以通過運行看到這個:

> as.vector(matrix(-rep(3:4,7), ncol=7)) 
[1] -3 -4 -3 -4 -3 -4 -3 -4 -3 -4 -3 -4 -3 -4 

看看向量的前兩個元素是如何矩陣的第一列?這就是爲什麼當你乘以1:7時,你會得到「不一致」的結果。你真的問R鍵做:

> (foo <- as.vector(matrix(-rep(3:4,7), ncol=7)) * 1:7) 
[1] -3 -8 -9 -16 -15 -24 -21 -4 -6 -12 -12 -20 -18 -28 

把它放回通過「矩陣」:

> dim(foo) <- c(2,7) 
> foo 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
[1,] -3 -9 -15 -21 -6 -12 -18 
[2,] -8 -16 -24 -4 -12 -20 -28 

如果你想利用的循環利用規則的優勢,你需要開始與轉置你當前的矩陣。然後乘以1:7並將結果轉置。說到轉置,您可能想要避免命名變量t,因爲這是轉置功能的名稱。

func <- function(v, alpha) { 
    t(exp(matrix(-rep(v,7), nrow=7, byrow=TRUE)*1:7*alpha)) 
} 
+0

感謝您的回答。我也很欣賞列主要與主要排列順序的細節(我正要在維基百科上查看)。我認爲R按預期工作,我只需要更深入地理解邏輯。 – user338714 2012-04-16 20:38:56

1

這會工作:

func <- function (t,alpha) exp(-rep(t,7) * sapply(1:7,rep,length(t)) * alpha)