2014-01-27 26 views
2

我有一個矩陣mat,看起來像:R獲取列的所有組合並在其上執行返回對稱矩陣的函數?

 A  B  C  D  E  F 
1 0.74 1.19 0.01 1.21 16000 0.02 
2 0.76 1.17 0.01 1.21 15500 0.02 
3 0.79 1.16 0.01 1.17 15625 0.02 
4 0.75 1.17 0.01 1.17 15600 0.02 
5 0.80 1.19 0.01 1.19 15225 0.02 
6 0.79 1.18 0.01 1.18 15625 0.02 

而且我想通過應用功能Sum(Col1-Col2)建立從這個對稱矩陣。最終結果將如下所示:

A  B  C  D  E  F 
A 0 
B   0 
C    0 
D      0 
E       0 
F         0 

這樣空白表示差異的總和。即[1,2] = Sum(A-B)

我已經調查的方法,如:

combs<-combn(names(mat),2) 
val<-apply(combs,2,function(x) mat[[x[1]]]-mat[[x[2]]]) 

但它並沒有給我一個很好的對稱矩陣。

任何人有任何想法?

謝謝。

編輯 - 感謝特洛伊上述作品。但如果我想要計算Sum((Col1-Col2)^2)Sum(((A_1,A_2,..,A_n)-(B_1,B_2,..,B_n))^2)(所以最初不能總計AB然後減去否則答案將會關閉)。

回答

2

這似乎是有效的,太:

outer(colSums(mat), colSums(mat), `-`) #I used Troy's `mat` 
#   A  B  C  D   E  F 
#A  0.00 -2.43  4.57 -2.50 -93570.37  4.51 
#B  2.43  0.00  7.00 -0.07 -93567.94  6.94 
#C -4.57 -7.00  0.00 -7.07 -93574.94 -0.06 
#D  2.50  0.07  7.07  0.00 -93567.87  7.01 
#E 93570.37 93567.94 93574.94 93567.87  0.00 93574.88 
#F -4.51 -6.94  0.06 -7.01 -93574.88  0.00 

編輯,以匹配編輯的問題:

n = seq_len(ncol(mat)) 
ff = function(a, b) sum((mat[,a] - mat[,b])^2) 
outer(n, n, Vectorize(ff)) 
#    [,1]   [,2]  [,3]   [,4]  [,5]   [,6] 
#[1,] 0.000000e+00 9.881000e-01 3.48390e+00 1.048400e+00 1459547504 3.393100e+00 
#[2,] 9.881000e-01 0.000000e+00 8.16740e+00 2.100000e-03 1459471669 8.028000e+00 
#[3,] 3.483900e+00 8.167400e+00 0.00000e+00 8.332500e+00 1459690004 6.000000e-04 
#[4,] 1.048400e+00 2.100000e-03 8.33250e+00 0.000000e+00 1459469476 8.191700e+00 
#[5,] 1.459548e+09 1.459472e+09 1.45969e+09 1.459469e+09   0 1.459688e+09 
#[6,] 3.393100e+00 8.028000e+00 6.00000e-04 8.191700e+00 1459688132 0.000000e+00 
+0

感謝@alexis_laz,我編輯了這個問題,所以我需要一些進一步的幫助! :) –

+1

@Ubobo:編輯幫助嗎? –

+0

絕對是!就是這樣,謝謝。我剛剛制定了一個非常迂迴,毫無疑問是無效的方式。你的解決方案要好得多。謝謝! –

2
mat<-as.matrix(read.table(text="A  B  C  D  E  F 
0.74 1.19 0.01 1.21 16000 0.02 
0.76 1.17 0.01 1.21 15500 0.02 
0.79 1.16 0.01 1.17 15625 0.02 
0.75 1.17 0.01 1.17 15600 0.02 
0.80 1.19 0.01 1.19 15225 0.02 
0.79 1.18 0.01 1.18 15625 0.02", header=T)) 


cross<-expand.grid(apply(mat,2,sum),apply(mat,2,sum)) 
matrix(cross[,1]-cross[,2],6) 

[,1]  [,2]  [,3]  [,4]  [,5]  [,6] 
[1,]  0.00 -2.43  4.57 -2.50 -93570.37  4.51 
[2,]  2.43  0.00  7.00 -0.07 -93567.94  6.94 
[3,] -4.57 -7.00  0.00 -7.07 -93574.94 -0.06 
[4,]  2.50  0.07  7.07  0.00 -93567.87  7.01 
[5,] 93570.37 93567.94 93574.94 93567.87  0.00 93574.88 
[6,] -4.51 -6.94  0.06 -7.01 -93574.88  0.00 

對於第二個問題,這個怎麼樣?

編輯 - 想我把支架放錯了地方

apply(mat,2,function(x)colSums((matrix(x,ncol(mat),ncol(mat))-mat)^2)) 
#    A   B   C   D   E   F 
#A 0.000000e+00 9.881000e-01 3.48390e+00 1.048400e+00 1459547504 3.393100e+00 
#B 9.881000e-01 0.000000e+00 8.16740e+00 2.100000e-03 1459471669 8.028000e+00 
#C 3.483900e+00 8.167400e+00 0.00000e+00 8.332500e+00 1459690004 6.000000e-04 
#D 1.048400e+00 2.100000e-03 8.33250e+00 0.000000e+00 1459469476 8.191700e+00 
#E 1.459548e+09 1.459472e+09 1.45969e+09 1.459469e+09   0 1.459688e+09 
#F 3.393100e+00 8.028000e+00 6.00000e-04 8.191700e+00 1459688132 0.000000e+00 
+0

謝謝@Troy。現在,如果我想做'Sum((A-B)^ 2)',我該怎麼去做呢?我認爲這裏的主要問題是,我不能總結'A'和'B'然後減去最初,我需要在每列的每行上執行此操作。所以像'Sum(((A_1,A_2,...,A_n) - (B_1,B_2,..,B_n))^ 2)''。謝謝! –

相關問題