2013-11-22 24 views
3

我有以下問題一個問題:動態高階行由行產品

假設我有一些矩陣

A1 <- matrix(runif(rowsA1*T), rowsA1, T) 
… 
AD <- matrix(runif(rowsAD*T), rowsAD, T) 

矩陣的數量是可變的(但肯定不是太大)。 是否有執行方式下更有效(但在一個建立,允許矩陣的變量數):

f1 <- function(A1, A2, ..., AD) { 
    for(i in 1:nrow(A1)) { 
    for(j in 1:nrow(A2)) { 
     ... 
     for(d in 1:nrow(AD)) { 
      ret[i,j,...,d] <- \sum_{t=1}^T (A1[i,t]*A2[j,t]*...*AD[d,t]) 
     } 
     ... 
    } 
    } 
ret 
} 

非常感謝您的幫助!

羅曼

----------------------------------用示例編輯---- ------------------------------

A1 <- |a b c| A2 <- |j k l| A3 <- |s t u| 
     |d e f|  |m n o|  |v w x| 
     |g h i|  |p q r|  |y z ä| 

而且我想例如得到以下:

ret[1,1,1] <- a*j*s + b*k*t + c*l*u 
ret[2,1,3] <- d*j*y + e*k*z + f*l*ä 

希望這可以讓我的觀點更清晰。

---------------------------------- Edit Nov.26th,2013 ------ -------------------------

嗨@flodel。我試圖實現你的代碼,但是一旦有三個以上的矩陣,似乎就會出現問題。

想,我有以下的矩陣

A1 <- matrix(runif(4*3), nrow = 4, ncol = 3) 
A2 <- matrix(runif(3*3), nrow = 3, ncol = 3) 
A3 <- matrix(runif(2*3), nrow = 2, ncol = 3) 
A4 <- matrix(runif(1*3), nrow = 1, ncol = 3) 

並pluging到您的代碼

output.f1 <- f1(A1,A2,A3,A4) 

提供尺寸

dim(output) 
# [1] 4 3 2 1 

的正確數量,但輸出是滿的NDA

output.f1 
# , , 1, 1 

      # [,1] [,2] [,3] 
# [1,] 0.13534704 NA NA 
# [2,] 0.07360135 NA NA 
# [3,] 0.07360135 NA NA 
# [4,] 0.07360135 NA NA 

# , , 2, 1 

    # [,1] [,2] [,3] 
# [1,] NA NA NA 
# [2,] NA NA NA 
# [3,] NA NA NA 
# [4,] NA NA NA 

感謝一些幫助......

最佳, 羅曼

+0

'A1,A2,...,AD'具有相同的尺寸,例如,都有3行4列? – zx8754

+1

矩陣'A1,A2,...,AD'具有相同的列數,這是肯定的。但是行數可能不同(但不一定)。 – RomainD

+0

請注意公式的修正。我發現錯誤太晚了。很抱歉,爲了方便! – RomainD

回答

1

試試這個。隨着大apply循環,這可能是與大矩陣慢,但會盡量做的工作爲一般到任意數量的矩陣,而不必在相同的行數:

f1 <- function(...) { 
    args <- list(...) 
    nrows <- sapply(args, nrow) 
    idx  <- do.call(expand.grid, lapply(nrows, seq.int)) 
    get.row <- function(i, mat) mat[i, ] 
    get.val <- function(i.vec) sum(Reduce(`*`, Map(get.row, i.vec, args))) 
    idx$val <- apply(idx, 1, get.val) 
    ret  <- array(NA, dim = nrows) 
    ret[as.matrix(idx[, seq_along(args)])] <- idx$val 
    ret 
} 

用法示例:

A1 <- matrix(1:12, nrow = 4, ncol = 3) 
A2 <- matrix(1:9, nrow = 3, ncol = 3) 
A3 <- matrix(1:6, nrow = 2, ncol = 3) 

out <- f1(A1, A2, A3) 

檢查:

identical(out[3, 2, 1], 
      sum(A1[3, ] * A2[2, ] * A3[1, ])) 
# [1] TRUE 
+0

(如果速度仍然是一個問題,讓我知道,我有其他的想法,但現在沒有多少時間來測試它們...) – flodel

+0

感謝flodel爲您的解決方案。的確,這個版本應該能夠滿足我的需求。但是如果你知道一個更快的版本,比我很樂意看到那個版本。 – RomainD

+0

嗨@flodel。你介意看看我上面的例子。我想你的解決方案有一個問題...謝謝 – RomainD