【问题标题】:turning a vector into a matrix of the pair permutations将向量转换为对排列的矩阵
【发布时间】:2021-02-14 08:59:53
【问题描述】:

我有一个包含 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

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

【问题讨论】:

  • 您可以将其简化为sapply(row, perm, row)
  • 这个想法是完全消除 apply 的使用

标签: r math matrix finance quantitative-finance


【解决方案1】:

在这种情况下(据我所知),没有办法完全消除循环。在所有情况下,您都必须计算每个元素对的函数。 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

如果函数针对矢量化进行了优化,这将更快(但更占用内存)

【讨论】:

    猜你喜欢
    • 2015-01-30
    • 2014-03-09
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2018-03-01
    • 2021-04-29
    相关资源
    最近更新 更多