我有一个矩阵,组成值0,1和2. 99%的值是0.矩阵有100万行和700列。每行至少会有一个非零值。
我需要使用此公式计算列x和y之间距离的每对列之间的距离: D =(Sum(| xi-yi |)/ 2L,i从1到L,L = 1百万,即行数。
我写了一段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
非常感谢您的帮助?
答案 0 :(得分:2)
我将简要总结一下评论中的内容:
#mac is the matrix
nCols=ncol(mac)
nRows=nrow(mac)
#the pairwise distance matrix
distMat=matrix(data=-1,nrow=nCols,ncol=nCols)
for(i in 1:(nCols-1)){
for(j in (i+1):nCols){
d1=abs(mac[,i]-mac[,j])
k=sum(d1)/(2*nRows)
distMat[i,j]=k
distMat[j,i]=k
}
}
diag(distMat) <- 0
对于2000x500矩阵,这大约快100倍。 对于1e6x700矩阵,花了大约半分钟。
答案 1 :(得分:1)
计算距离矩阵意味着您需要(n ^ 2-n)/ 2次操作。我并不感到意外,需要一段时间。
由于您需要所有配对,因此这些计算必须独立完成。动态编程无济于事。当您从较小的部件构建解决方案时,DP会有所帮助这里的一切都是独立的,所以DP不会帮助(据我所知)。
您说大多数条目都是0.尝试查看稀疏矩阵库。这个blog post可能会为您提供在R中执行此操作的一些想法。