2014-10-06 114 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