2015-01-14 80 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))