2014-10-16 54 views
0

我正在研究一個漁業庫存評估模型,並希望通過刪除一個循環(實際上是相同形式的兩個循環)來加速它。我有一個數組A,dim(A)= [L,L,Y]和一個矩陣M dim(M)= [L,Y]。 這些通過計算矩陣乘積來生成矩陣,mat,dim(mat)= [L,Y]。我的循環看起來像:在R中沒有循環的3D陣列和矩陣列元素的交叉產品

for(i in 1:Y){ 
mat[,i]<-(A[,,i]%*%M[,i])[,1]} 

任何人都可以幫我嗎?我真的需要速度增益。另外,(不知道它是否會有所作爲,但是)每個A [,, i]矩陣都是下三角形。

+0

我認爲最關鍵的是,取消所有不利於第一列的計算。你應該發佈一個簡化的例子。 – 2014-10-16 20:06:52

+0

最後一個子集到第一列是多餘的。無論如何,循環內的矩陣乘法只產生一列。 – ilir 2014-10-16 21:36:28

回答

0

我很確定這會給你你想要的結果。由於沒有可重複的例子,我不能絕對確定。必須追蹤一些線性代數邏輯來看看你正在努力完成什麼。

library(plyr) # We need this to split the array into a list of 9 matrices 
B = lapply(alply(A, 3), function(x) (x%*%M)) # Perform 9 linear algebra multiplications 
sapply(1:9, function(i) (B[[i]])[,i]) # Extract the 9 columns you actually want. 

我用下面的測試數據:

A = array(rnorm(225), dim = c(5,5,9)) 
M = matrix(rnorm(45), nrow = 5, ncol = 9) 
+0

這是不是比for循環慢? – 2014-10-16 21:09:58

+0

我不知道,因爲OP代碼實際上並沒有爲我運行。想想看,它可能會更慢......我們會看到。我會在OP回覆時刪除。 – Vlo 2014-10-16 21:15:57

+0

OP代碼爲我運行。只需用ncol(M)替換Y並在某處添加mat < - matrix(NA,ncol = ncol(M),nrow = nrow(M))。 它比plyr更快。不知道這是否是plyr本身的屬性。無論如何,OP沒有回覆,所以可能不再相關。 – 2014-10-16 21:20:01