R中二元矩阵元素的距离矩阵

时间:2019-09-18 06:00:06

标签: r matrix

我有一个二进制矩阵A,需要计算元素之间的距离:

enter image description here

其中< , >是内积。

我对4 x 4矩阵的尝试如下。

n = 4
A <- matrix(c(0,1,1,1, 0,0,1,1, 0,0,0,1, 1,0,0,0), n, n, byrow = TRUE); A
D <- matrix(0,n,n)

for(i in 1:n){
for(j in 1:n){
if(i != j) {
        tmp <- sqrt(max(abs( (A[i,] - A[j,])  %*% A[3,])/n))
        for(k in 1:n){
                 if(k != i && k != j) {
                    tmp_max <- sqrt(max(abs( (A[i,] - A[j,]) %*% A[k,])/n))
                 if(tmp_max > tmp) D[i,j] <- tmp_max
                 } # if 
        } # k
}
} # j
} # i
D

输出是矩阵D:

          [,1]      [,2] [,3]      [,4]
[1,] 0.0000000 0.0000000  0.5 0.7071068
[2,] 0.0000000 0.0000000  0.5 0.7071068
[3,] 0.5000000 0.5000000  0.0 0.0000000
[4,] 0.7071068 0.7071068  0.0 0.0000000

预期结果是

          [,1] [,2] [,3]      [,4]
[1,] 0.0000000 0.5  0.7071068 0.7071068
[2,] 0.5000000 0.0  0.5000000 0.5000000
[3,] 0.7071068 0.5  0.0000000 0.0000000
[4,] 0.7071068 0.5  0.0000000 0.0000000

问题

如何正确计算距离矩阵?

1 个答案:

答案 0 :(得分:1)

以下是距离矩阵公式的直接转换。我们使用两个sapply循环。

n <- 4
A <- matrix(c(0,1,1,1, 0,0,1,1, 0,0,0,1, 1,0,0,0), n, n, byrow = TRUE)

df <- as.data.frame(A)
sapply(1:nrow(df), function(i)
    sapply(1:nrow(df), function(j)
        sqrt(max(abs((df[, i] - df[, j]) %*% as.matrix(df[, -c(i, j)]) / n)))
    )
)
#          [,1] [,2]      [,3]      [,4]
#[1,] 0.0000000  0.5 0.7071068 0.7071068
#[2,] 0.5000000  0.0 0.5000000 0.5000000
#[3,] 0.7071068  0.5 0.0000000 0.0000000
#[4,] 0.7071068  0.5 0.0000000 0.0000000

结果与您的预期输出相同。