使用动态编程计算矩阵距离

时间:2015-03-02 23:12:46

标签: r dynamic matrix

我有一个矩阵,组成值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

非常感谢您的帮助?

2 个答案:

答案 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中执行此操作的一些想法。

相关问题