R两个矩阵之间的匹配函数

时间:2014-09-10 01:11:11

标签: r matrix

很抱歉,如果之前已发布此消息。我在Google和Stackoverflow上寻找答案,但找不到解决方案。

现在我在R中有两个数据矩阵。我试图循环遍历矩阵中的每一行,并在另一个矩阵中找到与某个距离度量最相似的行(对于现在最小的平方)。我想出了一种方法,但它是O(n ^ 2),这对我的数据来说是禁止的。

我认为这可能类似于一些字典学习技巧,但我找不到任何东西。

谢谢!

两个矩阵只有30个n个矩阵,每个条目都有一个数字。

distance.fun=function(mat1,mat2){   
  match=c()  
  for (i in 1:nrow(mat1)){  

    if (all(is.na(mat1[i,]))==FALSE){  
    dist=c()  

    for (j in 1:nrow(mat2)){  
      dist[j]=sum((mat1[i,]-mat2[j,])^2)  
      match[i]=which(min(dist) %in% dist)  
    }  
    }  
  }  
  return(match)  
}

1 个答案:

答案 0 :(得分:0)

更好的策略是首先计算距离矩阵,然后提取分钟。以下是使用simualted数据的示例

set.seed(15)
mat1<-matrix(runif(2*25), ncol=2)
mat2<-matrix(runif(2*25), ncol=2)

这是一个辅助函数,可以计算一个矩阵到另一个矩阵的值之间的距离。它使用内置的dist函数,但它确实进行了不必要的组内比较,我们最终必须将其过滤掉,但整体表现可能会更好。

distab<-function(m1, m2) {
    stopifnot(ncol(m1)==ncol(m2))
    m<-as.matrix(dist(rbind(m1, m2)))[1:nrow(m1), -(1:nrow(m1))]
    rownames(m)<-rownames(m1)
    colnames(m)<-rownames(m2)
    m
}

mydist<-distab(mat1, mat2)

现在我们有组间距离,我们只需要最小化匹配。

best <- apply(mydist, 2, which.min)
rr <- cbind(m1.row=seq.int(nrow(mat1)), best.m2.row = best)
head(rr)   #just print a few

#      m1.row best.m2.row
# [1,]      1           1
# [2,]      2          14
# [3,]      3           7
# [4,]      4           3
# [5,]      5          23
# [6,]      6          15

请注意,使用这样的策略(我们与您的原始实现一样),mat1中的多行可能与mat2中的同一行和{{1中的某些行匹配要与mat2无法匹配。