2017-06-13 90 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函数的输入。 –

相关问题