R中的外函数用于上三角矩阵

时间:2016-03-22 15:31:39

标签: r matrix diagonal

我目前有这个代码

s1=seq(0,10,length.out=3)
s2=seq(0,10,length.out=3)
d=outer(s1,s2,`-`)
I=outer(s1,s2,`==`)

但是我只想要d的上三角形,所以我现在正在做

d=d[upper.tri(d,diag=T)]
I=I[upper.tri(I,diag=T)]

有没有办法通过在外部函数中加入上三角矩阵来加快这段代码的速度? 请注意,这是一个可重现的示例,但是我的代码要大得多,我需要尽可能地减少运行时间。

1 个答案:

答案 0 :(得分:3)

outer在内部使用rep来扩展其参数:

    Y <- rep(Y, rep.int(length(X), length(Y)))
    if (length(X)) 
        X <- rep(X, times = ceiling(length(Y)/length(X)))

您可以使用子集来执行相同的操作,但只生成三角形索引。在这种情况下,sequence是一个有用的辅助函数:

> i <- sequence(1:3)
> j <- rep(1:3, 1:3)
> d = s1[i] - s2[j]
> I = s1[i] == s2[j]
> d
[1]   0  -5   0 -10  -5   0
> I
[1]  TRUE FALSE  TRUE FALSE FALSE  TRUE