【问题标题】:Distance Matrix Computation距离矩阵计算
【发布时间】:2018-08-05 19:53:52
【问题描述】:

我们有两个矩阵,例如:

A=
     [,1] [,2] [,3]
[1,]   -2    1    0
[2,]    1    0   -1
[3,]    0   -1    4

B=
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    2    3
[3,]    3    1    2
[4,]    2    3    1
[5,]    3    1    2

我会计算 A 行和 B 行之间的距离矩阵。换句话说,使用我们的示例:

      [,1]                   [,2]                    [,3]
[1,]    dist(B[1,]-A[1,])      dist(B[1,]-A[2,])       dist(B[1,]-A[3,])
[2,]    dist(B[2,]-A[1,])      dist(B[2,]-A[2,])       dist(B[2,]-A[3,])
[3,]    dist(B[3,]-A[1,])      dist(B[3,]-A[2,])       dist(B[3,]-A[3,])
[4,]    dist(B[4,]-A[1,])      dist(B[4,]-A[2,])       dist(B[4,]-A[3,])
[5,]    dist(B[5,]-A[1,])      dist(B[5,]-A[2,])       dist(B[5,]-A[3,])

我正在考虑使用函数“dist”,它计算并返回数据矩阵行之间距离的距离矩阵。但它仅适用于单个矩阵。我尝试使用命令“rbind(A,B)”并将“dist”应用于生成的矩阵,但在这种情况下,我还获得了同一矩阵的行之间的距离。

【问题讨论】:

  • 这些矩阵有多大?使用您的解决方案并将结果子集化为感兴趣的距离可能是最有效的。
  • 几千行。但我无法对结果进行子集化。

标签: r matrix


【解决方案1】:

也许是这样?

A = matrix(c(-2, 1, 0, 1, 0, -1, 0, -1, 4), ncol = 3, byrow = TRUE)
B = matrix(c(1, 2, 3, 1, 2, 3, 3, 1, 2, 2, 3, 1, 3, 1, 2), ncol = 3, byrow = TRUE)

t(sapply(1:nrow(B), function(x) {
  sqrt(rowSums(t(t(A)-B[x,])^2))
}))

         [,1]     [,2]     [,3]
[1,] 4.358899 4.472136 3.316625
[2,] 4.358899 4.472136 3.316625
[3,] 5.385165 3.741657 4.123106
[4,] 4.582576 3.741657 5.385165
[5,] 5.385165 3.741657 4.123106

【讨论】:

    【解决方案2】:
    # First build a matrix
      Dist.M <- matrix(0, nrow = nrow(A), ncol = ncol(B))
    
    # Complete the matrix
      for (i in 1:nrow(A)){
        for (j in 1:nrow(B)){
             Dist.M[i,j] <- dist(rbind(A[i,],B[j,])
        }
      }
    

    【讨论】: