【发布时间】:2015-06-20 23:24:08
【问题描述】:
我有两个 2x2 矩阵数组,我想在每对 2x2 矩阵上应用一个函数。这是一个最小的示例,将 A 中的每个矩阵乘以 B 中的相应矩阵:
A <- array(1:20, c(5,2,2))
B <- array(1:20, c(5,2,2))
n <- nrow(A)
# Desired output: array with dimension 5x2x2 that contains
# the product of each pair of 2x2 matrices in A and B.
C <- aperm(sapply(1:n, function(i) A[i,,]%*%B[i,,], simplify="array"), c(3,1,2))
这需要两个数组,每个数组有 5 个 2x2 矩阵,然后将每对 2x2 矩阵相乘,在 C 中得到所需的结果。
我当前的代码是这个丑陋的最后一行,使用 sapply 循环遍历第一个数组维度并从 A 和 B 中分别拉出每个 2x2 矩阵。然后我需要用 aperm() 置换数组维度以便拥有与原始数组相同的顺序(sapply(...,simplify="array") 使用第三维而不是第一个维度索引每个 2x2 矩阵)。
有没有更好的方法来做到这一点?我讨厌那里的那个丑陋的函数(i),这实际上只是一种伪造 for 循环的方法。而 aperm() 调用使这变得不那么可读。我现在的工作正常;我只是在寻找更像是惯用 R 的东西。
mapply() 将采用多个列表或向量,但它似乎不适用于数组。 plyr 的 aaply() 也很接近,但它不需要多个输入。我最接近的是使用 abind() 和 aaply() 将 A 和 B 打包到一个数组中一次使用 2 个矩阵,但这并不完全有效(它只获取前两个条目;我的索引已关闭):
aaply(.data=abind(A,B,along=0), 1, function(ab) ab[1,,]%*%ab[2,,])
无论如何,这并不完全干净或清晰!
我试图将其作为一个最小的示例,但我的实际用例需要更复杂的矩阵对函数(而且我也希望将其扩展到两个以上的数组),所以我寻找可以概括和扩展的东西。
【问题讨论】: