2013-08-10 36 views
18

Ich habe eine Matrix in R, die symmetrisch sein soll, aber aufgrund der Maschinengenauigkeit ist die Matrix nie symmetrisch (die Werte unterscheiden sich um etwa 10^-16). Da ich weiß, dass die Matrix symmetrisch ist Ich habe dies, um das Problem zu bekommen bisher tun:Erstellen einer symmetrischen Matrix in R

s.diag = diag(s) 
s[lower.tri(s,diag=T)] = 0 
s = s + t(s) + diag(s.diag,S) 

Gibt es einen besseren Zeilenbefehl für diese?

Antwort

9

Ist die Umgehung wirklich notwendig, wenn sich die Werte nur um so viel unterscheiden?

Jemand wies darauf hin, dass meine vorherige Antwort falsch war. Ich mag einige der anderen diejenigen besser, aber da ich nicht dieses (angenommen durch einen Benutzer, der links) löschen können, hier ist noch eine andere Lösung mit der micEcon Paket:

symMatrix(s[upper.tri(s, TRUE)], nrow=nrow(s), byrow=TRUE) 
+0

Dies funktioniert nicht. '> s = Matrix (c (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16), nrow = 4) > s [Zeile (s)> col (s)] <- s [Reihe (n) s [, 1] [, 2] [, 3] [, 4] [1,] 1 5 9 13 [2,] 5 6 10 14 [3,] 9 13 11 15 [4,] 10 14 15 16 ' –

5
s<-matrix(1:25,5) 
pmean <- function(x,y) (x+y)/2 
s[] <- pmean(s, matrix(s, nrow(s), byrow=TRUE)) 
s 
#------- 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 4 7 10 13 
[2,] 4 7 10 13 16 
[3,] 7 10 13 16 19 
[4,] 10 13 16 19 22 
[5,] 13 16 19 22 25 
+1

oder einfach' s <- 0,5 * (s + t (s)) '. Ich mag Ihren Ansatz besser, da die Annahme des Mittelwerts davon ausgeht, dass jede dreieckige Seite gleich korrekt (oder falsch) ist. Während andere Lösungen willkürlich eine auswählen. – flodel

10

Sie können die Kraft Matrix symmetrisch Verwendung forceSymmetric Funktion in Matrix Paket in R:

library(Matrix) 
x<-Matrix(rnorm(9), 3) 
> x 
3 x 3 Matrix of class "dgeMatrix" 
      [,1]  [,2]  [,3] 
[1,] -1.3484514 -0.4460452 -0.2828216 
[2,] 0.7076883 -1.0411563 0.4324291 
[3,] -0.4108909 -0.3292247 -0.3076071 

A <- forceSymmetric(x) 
> A 
3 x 3 Matrix of class "dsyMatrix" 
      [,1]  [,2]  [,3] 
[1,] -1.3484514 -0.4460452 -0.2828216 
[2,] -0.4460452 -1.0411563 0.4324291 
[3,] -0.2828216 0.4324291 -0.3076071 
39
s<-matrix(1:25,5) 
s[lower.tri(s)] = t(s)[lower.tri(s)] 
+0

sehr gut! Dies funktioniert auch, wenn die Matrix keine Zahlen, sondern Symbole enthält. betrachte etwas wie s <-Matrix (BRIEFE [1:25], 5) –

Verwandte Themen