【发布时间】:2015-03-02 23:12:45
【问题描述】:
我有一个由值 0、1 和 2 组成的矩阵。99% 的值是 0。该矩阵有 100 万行和 700 列。每行至少有一个非零值。
我需要使用以下公式计算每对列之间的距离,用于计算列 x 和 y 之间的距离: D=(Sum(|xi-yi|)/2L for i from 1 to L, L=100万,即行数。
我写了一段 R 代码,但是计算时间太长,是否可以使用动态编程来更快地完成它?这是我的代码:
#mac is the matrix
nCols=ncol(mac)
nRows=nrow(mac)
#the pairwise distance matrix
distMat=matrix(data=-1,nrow=nCols,ncol=nCols)
abs.dist=function(x){return(abs(x[1]-x[2]))}
for(i in 1:(nCols-1)){
for(j in (i+1):nCols){
d1=apply(mac[,c(i,j),1,abs.dist)
k=sum(d1)/(2*nRows)
distMat[i,j]=k
distMat[j,i]=k
}
}
for(i in 1:nCols) distMat[i,i]=0
非常感谢您的帮助?
【问题讨论】:
-
我认为您使用
apply计算绝对差异会降低性能。减法和求绝对值是矢量化的,所以你可以简单地做d1 <- abs(mac[,i]-mac[,j]) -
顺便说一句,你可以在最后一行做
diag(distMat) <- 0 -
有了这么大的矩阵,您可能会考虑使用并行处理和
Rcpp。以下是一些您应该能够适应的代码:Parallel Distance Matrix in R with Rcpp.