将向量转换为对排列的矩阵

turning a vector into a matrix of the pair permutations

我有一个包含 n 列的时间序列,其中 n >=2。对于每一行,我都试图通过对 n 元素的每个排列应用一个函数来生成一个矩阵。例如:

perm <- function(x, y) x-y
row = c(1, 2, 3)
sapply(row,function(x) sapply(row, function(y) perm(x,y)))

> sapply(row,function(x) sapply(row, function(y) perm(x,y)))
     [,1] [,2] [,3]
[1,]    0    1    2
[2,]   -1    0    1
[3,]   -2   -1    0

这种方法行之有效。但我知道这不。我只是觉得有一种更好的方法可以使用矩阵数学函数来做到这一点,但我还没有完全弄明白。 apply 方法很好,但我知道我可以做得更好。在这种情况下,为如图所示的简单减法再现输出将是一个很好的答案,但理想情况下,它会附带一些指示,指向在文档中查找其他类型操作的位置。至于它的价值,如果有人关心的话,实际数据是各种期限的利率列表,最终输出将是远期利率矩阵,所以只有上三角很重要,对角线和下三角不会'没有任何信息。

在这种情况下(据我所知)无法完全消除循环。在所有情况下,您都必须计算每个元素对的函数。 R 确实有专门为此构建的函数 outer

outer(row, row, perm)
     [,1] [,2] [,3]
[1,]    0   -1   -2
[2,]    1    0   -1
[3,]    2    1    0

与普通循环相比,不一定使用outer更快,但它设计的内置方法为了这个目的。

编辑:向量化函数

但是,如果函数是矢量化的(如 perm),则可以使用一种方法。生成所有排列然后添加维度

n <- length(row)
perm1 <- row[rep(1:n, n)]
perm2 <- row[rep(1:n, each = n)]
res <- perm(perm1, perm2)
dim(res) <- c(n, n) #change to a 2 dimensional array (matrix)
res
     [,1] [,2] [,3]
[1,]    0   -1   -2
[2,]    1    0   -1
[3,]    2    1    0

如果函数针对矢量化进行了优化,速度会更快(但会占用更多内存)