我有一个二进制矩阵A
,需要计算元素之间的距离:
其中< , >
是内积。
我对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
问题。
如何正确计算距离矩阵?
答案 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
结果与您的预期输出相同。