将向量转换为一对置换矩阵

问题描述

我有一个包含 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,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 不一定一定更快,但它是为此目的而设计的内置方法。

编辑:矢量化函数

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

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
     [,]    2    1    0

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