2015-01-14 52 views
2

我有两个相同大小的矩阵。我想计算这些矩阵中每对行之间的相关系数;选自B等与第2行1列B,列2从A行1从AR行中的相关性

A <- matrix(runif(1:200), nrow=20) 
B <- matrix(runif(1:200), nrow=20) 

最佳我能想出是

ret <- sapply(1:20, function(i) cor(A[i,], B[i,])) 

但它是非常低效的(矩阵具有成千上万的行)。有更好,更快的方法吗?

回答

5

这应该是快:

cA <- A - rowMeans(A) 
cB <- B - rowMeans(B) 
sA <- sqrt(rowMeans(cA^2)) 
sB <- sqrt(rowMeans(cB^2)) 

rowMeans(cA * cB)/(sA * sB) 
2

您可以创建矢量化功能,将计算协方差和标清的,你这样的,

RowSD <- function(x) { 
    sqrt(rowSums((x - rowMeans(x))^2)/(dim(x)[2] - 1)) 
} 

VecCov <- function(x, y){ 
    rowSums((x - rowMeans(x))*(y - rowMeans(y)))/(dim(x)[2] - 1) 
} 

然后,只需做

VecCov(A, B)/(RowSD(A) * RowSD(B))