2014-10-06 109 views
0

我有m <- a 100*6 matrix。我想返回一個6*6 matrix,和條目(I,J)的6*6 matrix包含以下值:在r中運行矩陣的函數

(mean(col.i)-mean(col.j))/sd(col.i and col.j) 

其中,sd(col.i和col.j)是來自所有值的標準差col.i and col.j

我想使用應用函數來做到這一點,但我不知道如何組合矩陣m的每兩列。那麼我怎樣才能得到6 * 6矩陣呢?我應該使用什麼函數?(in r)

+0

如果僅僅爲了可讀性和易於調試,你可能會更好一個循環。然後,如果您需要性能,則可以隨後將其包裝在應用功能中。 – shadowtalker 2014-10-06 05:07:37

+0

我只能使用應用功能來做到這一點嗎? – John777 2014-10-06 05:55:52

+0

這與我所建議的完全相反。首先嚐試使用* loop *,以獲得正確的算法。從'apply'開始往往是一種過早優化的形式,這通常是一個糟糕的主意。然而,在這種情況下,@nicola的答案是正確的,可讀的,代表良好的R風格,並且是「mapply」的一個很好的例子,它可能會讓學習如何使用。 – shadowtalker 2014-10-06 14:51:25

回答

-1

沒有關於您所使用的平臺/語言的任何細節,我可以給出以下一般建議: 1.找到每列中元素的含義。 2.找到每列中元素的平方和。 然後,您可以使用https://en.wikipedia.org/wiki/Standard_deviation#Identities_and_mathematical_properties中給出的公式來獲得所需的標準偏差。的公式爲:

標準偏差= SQRT(1/N *(平方和) - 平均值的(正方形))

+0

我想使用應用函數來做到這一點,該功能應該能夠適用於所有矩陣。 – John777 2014-10-06 05:38:15

+1

他正在使用R,這個信息在問題的標籤 – 2014-10-06 06:21:59

2

可以通過expand.grid創建i,j索引的所有連擊,然後使用mapply獲取矩陣的任何元素。像這樣:

#generate a sample matrix 
    m<-matrix(runif(600),ncol=6) 
    #generate the indices 
    indices<-expand.grid(1:6,1:6) 
    #the result 
    res<-matrix(mapply(function (x,y) (mean(m[,x])-mean(m[,y]))/sd(m[,c(x,y)]),indices[[1]],indices[[2]]),ncol=6) 
+0

請注意,這裏的一個關鍵是'sd'通過堆疊列來處理'm [,c(x,y)]'就像一個向量,或者「展開」矩陣(無論哪種類比效果最好)。 – shadowtalker 2014-10-06 14:56:36