我有2个大矩阵(通常尺寸为5000 * 40和20000 * 40)。我正在尝试创建一个相关矩阵,我想计算从第一个矩阵到第二个矩阵中每隔一行的每一行的相关性。我遵循最少的代码,需要很长时间。任何加速或平行的建议。感谢
-Jaison
nprots <- 50 #usually ca. 5000
ngenes <- 1000 #usually ca. 20000
a_mat <- matrix( runif(40*nprots, 120, 116000), ncol=40)
b_mat <- matrix( runif(40*ngenes, 0.1, 1000), ncol=40)
system.time(apply( a_mat, 1, function(xx)
apply(b_mat, 1, cor, y = xx, use = "pairwise.complete.obs")) -> cor_mat)
答案 0 :(得分:0)
谢谢理查德,我确实看到了你所提到的关于SO的帖子,但是在没有考虑太多的情况下将其传递过来,因为它似乎与我的问题无关。我有2个矩阵,我在其中执行相关。再多想一想这个问题,我的昏暗大脑让我可以简单地扩展你指出的解决方案以适应我的问题。找到两个矩阵,然后按照你提到的解决方案。最后,我提取出相关矩阵的相关角点。这比使用apply和cor的原始代码更快。我仔细检查了答案,一切似乎都没问题。以下是我目前的解决方案。
fast_cor <- function(a,b) {
mat <- rbind(a, b);
mat <- mat - rowMeans(mat);
mat <- mat / sqrt(rowSums(mat^2));
cr <- tcrossprod(mat)
edge <- dim(a_mat)[1]
cr <- t(cr[1:edge, -c(1:edge)])
return(cr)
}
nprots <- 50 #usually ca. 5000
ngenes <- 10000 #usually ca. 20000
a_mat <- matrix( runif(40*nprots, 120, 116000), ncol=40)
b_mat <- matrix( runif(40*ngenes, 0.1, 1000), ncol=40)
system.time(apply( a_mat, 1, function(xx)
apply(b_mat, 1, cor, y = xx, use = "pairwise.complete.obs")) -> c_1)
user system elapsed
20.48 0.00 20.48
system.time(c_2 <- fast_cor(a_mat, b_mat))
user system elapsed
1.97 0.11 2.08