我有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)
我有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)
沒有關於您所使用的平臺/語言的任何細節,我可以給出以下一般建議: 1.找到每列中元素的含義。 2.找到每列中元素的平方和。 然後,您可以使用https://en.wikipedia.org/wiki/Standard_deviation#Identities_and_mathematical_properties中給出的公式來獲得所需的標準偏差。的公式爲:
標準偏差= SQRT(1/N *(平方和) - 平均值的(正方形))
我想使用應用函數來做到這一點,該功能應該能夠適用於所有矩陣。 – John777 2014-10-06 05:38:15
他正在使用R,這個信息在問題的標籤 – 2014-10-06 06:21:59
可以通過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)
請注意,這裏的一個關鍵是'sd'通過堆疊列來處理'm [,c(x,y)]'就像一個向量,或者「展開」矩陣(無論哪種類比效果最好)。 – shadowtalker 2014-10-06 14:56:36
如果僅僅爲了可讀性和易於調試,你可能會更好一個循環。然後,如果您需要性能,則可以隨後將其包裝在應用功能中。 – shadowtalker 2014-10-06 05:07:37
我只能使用應用功能來做到這一點嗎? – John777 2014-10-06 05:55:52
這與我所建議的完全相反。首先嚐試使用* loop *,以獲得正確的算法。從'apply'開始往往是一種過早優化的形式,這通常是一個糟糕的主意。然而,在這種情況下,@nicola的答案是正確的,可讀的,代表良好的R風格,並且是「mapply」的一個很好的例子,它可能會讓學習如何使用。 – shadowtalker 2014-10-06 14:51:25