对列表

时间:2017-06-13 11:55:48

标签: r matrix combinations

我想迭代R中列表中元素的成对组合,然后使用组合作为输入执行函数。

在这个最小的例子中,I(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 个答案:

答案 0 :(得分: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函数的输入。

不知道你想要什么。给你一些其他的选择,然后拿起自己。它们都不同。

:此吗

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

:此吗

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