2017-02-24 193 views
3

我喜歡乘以具有相同行的兩個矩陣的列的所有可能組合。這意味着兩個矩陣(例如,和b[3x4])將生成3×4矩陣,其元素爲a[i,j]*a[k,j]。 (ik表示行範圍從1至3和j表示列從1到4)如何將兩個矩陣的列與所有組合相乘

我已經創建了一個例子,可以做到這一點的工作,但一直在尋找無for循環優雅的解決方案。

a <- matrix(1:12,3,4) 
b <- matrix(1:9,3,3) 
comb<-matrix(NA,3,(ncol(a)*ncol(b))) 

for (i in 1:nrow(a)){ 
comb[i,]<-apply(expand.grid(a[i,],b[i,]),1,prod) 
} 
comb 

這裏,是3×3矩陣,b爲3×4矩陣,並且通過梳各列相乘給出3x12矩陣的輸出。我正在尋找優雅的解決方案,可以推廣到這種乘法超過兩個矩陣。

回答

3

這裏有一些單行遞減長度順序:

t(sapply(1:3, function(i) tcrossprod(a[i, ], b[i, ]))) 

t(mapply(outer, split(a, 1:3), split(b, 1:3))) 

matrix(apply(a %o% b, c(2, 4), diag), 3) 

(b %x% a)[!!diag(3), ] 
+0

的!!診斷可能是'C(TRUE,邏輯(3))',我想......不知道這是一種提升。 – Frank

+0

感謝@Grothendieck提供多種優雅的解決方案。它讓我有機會學習R的優秀特性 –