2017-06-13 94 views
-1

我想遍歷R中列表中元素的成對組合,然後執行一個使用該組合作爲輸入的函數。 (1)定義三個矩陣,(2)將它們組合成一個包含矩陣的列表作爲元素,然後(3)想要計算在這個最小的例子中的元素組合的點積列表(即矩陣1對矩陣2和矩陣2對矩陣3)。在列表中的元素組合上應用一個函數

set.seed 

m1 = as.matrix(replicate(2, rnorm(2))) 
m2 = as.matrix(replicate(2, rnorm(2))) 
m3 = as.matrix(replicate(2, rnorm(2))) 

matrix.list = list(m1, m2, m3) 

dot.prod = function(matrix.x, matrix.y){ 
    return(matrix.x %*% matrix.y) 
} 

到目前爲止我有以下有matrix.list的所有組合作爲dot.prod輸入(),使用一個嵌套循環。

for (i in 1:length(matrix.list)){ 

    for (j in 1:length(matrix.list)){ 

      print(dot.prod(matrix.list[[i]], matrix.list[[j]])) 
    } 
} 

是否有可能通過使用R中的組合函數(如combn())來做到這一點?我會非常感謝任何建議。

編輯:函數本身並不重要 - 我想知道如何作爲輸入使用元素的組合,從列表中的任何一個R函數

+1

你能提供一個可重複的例子(剛加入'set.seed'頂部)和展這個例子所需的輸出?我不完全清楚你最終想要什麼樣的結構以及你開始的結構。 – lmo

回答

2

我們只是做

oo <- outer(matrix.list, matrix.list, Vectorize(crossprod, SIMPLIFY = FALSE)) 

,讓你一個矩陣列表。訪問結果很方便。 oo[1,2](實際上進入名單oo[1,2][[1]])給出矩陣1和矩陣2

注意,之間的交叉產品矩陣交叉產品是不是%*%(但如果你堅持,使用Vectorize("%*%", SIMPLIFY = FALSE))。由於操作不對稱,因此oo[1,2]oo[2,1]不同。

請參閱How to perform pairwise operation like `%in%` and set operations for a list of vectors爲最初的想法。


感謝您的答覆。澄清:我想計算點產品,而不是交叉產品,正如我在最初的問題中所述。然而,函數本身並不重要 - 我想知道如何使用列表中的元素組合作爲任何R函數的輸入。

不知道你想要什麼。給你一些其他的選擇,拿起自己。他們都是不同的。

This?

combn(matrix.list, 2, function (u) u[[1]] %*% u[[2]]) 

這?

mapply("%*%", matrix.list[-length(matrix.list)], matrix.list[-1], SIMPLIFY = FALSE) 
+0

感謝您的回覆。澄清:我想計算點產品,而不是交叉產品,正如我在最初的問題中所述。然而,函數本身並不重要 - 我想知道如何使用列表中的元素組合作爲任何R函數的輸入。 –

相關問題