2016-03-22 6 views
2

Ich habe diesen Code zur Zeitäußerte Funktion in R für obere Dreiecksmatrix

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

jedoch nur ich das obere Dreieck von d will und ich so bin ich zur Zeit

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

tun Gibt es eine Möglichkeit um diesen Code schneller zu machen, indem die obere Dreiecksmatrix in die äußere Funktion integriert wird? Beachten Sie, dass dies ein reproduzierbares Beispiel ist, jedoch ist mein Code viel größer und ich muss die Laufzeit so weit wie möglich reduzieren.

+0

was ist 'a' und' b'? – akrun

+0

@akrun beide s1 und s2 sind gleich und s = b = s1 = s2 – raK1

+0

@akrun können Sie bitte erklären, wie Combn in dieser Situation zu verwenden? – raK1

Antwort

3

outer intern verwendet rep seine Argumente zu strecken:

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

Sie können das gleiche tun subsetting verwenden, sondern stattdessen nur die Dreiecksindizes erzeugen. sequence ist eine nützliche Hilfsfunktion in diesem Fall:

> 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