2013-08-10 72 views
18

Tôi có ma trận trong R được cho là đối xứng, tuy nhiên, do độ chính xác của máy, ma trận không bao giờ đối xứng (các giá trị khác nhau khoảng 10^-16). Vì tôi biết ma trận là đối xứng nên tôi đã làm điều này cho đến nay để giải quyết vấn đề:Tạo ma trận đối xứng trong R

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

Có lệnh nào tốt hơn cho điều này không?

Trả lời

9

Giải pháp thay thế có thực sự cần thiết không nếu giá trị chỉ khác nhau nhiều?

Ai đó đã chỉ ra rằng câu trả lời trước của tôi là sai. Tôi thích một số những cái khác tốt hơn, nhưng kể từ khi tôi không thể xóa cái này (chấp nhận bởi một người dùng rời), đây là thêm một giải pháp sử dụng các micEcon gói:

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

doesnt làm việc này. '> s = ma trận (c (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16), nrow = 4) > s [hàng (s)> col (s)] <- s [hàng (s) 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

hoặc chỉ' s <- 0.5 * (s + t (s)) '. Tôi thích cách tiếp cận của bạn tốt hơn kể từ khi lấy trung bình là giả sử mỗi bên tam giác là như nhau đúng (hoặc sai). Trong khi các giải pháp khác tùy ý chọn một. – flodel

10

Bạn có thể buộc các ma trận đối xứng sử dụng forceSymmetric chức năng trong Matrix gói vào 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

rất tốt! Điều này cũng sẽ hoạt động khi ma trận không chứa số, nhưng ký hiệu. xem xét một cái gì đó giống như s <-matrix (LETTERS [1:25], 5) –

Các vấn đề liên quan