有没有更有效的方法来跨矩阵的连续行执行功能?

Is there a more efficient way to perform a function across sequential rows of a matrix?

我想计算矩阵的每一行与同一矩阵的每一行之间的 variation of informationdist 中不包含此距离度量,因此我必须手动迭代。每一行都是一个聚类,每一列都是一个样本。矩阵的值为 {1,0},表示样本是否属于聚类。这是一个示例矩阵和我现在拥有的。虽然这可能需要一些时间,但有没有更有效的方法来执行此计算?

# subset those clusterings which meet threshold of member count
m <- 100
n <- 70
membership <- matrix(sample(0:1, m * n, replace = TRUE), m, n)

# create distance matrix, set diagonal to 0
dist.matrix <- matrix(, nrow = m, ncol = m)
diag(dist.matrix) <- 0

# iterate through each row and calculate distances with subsequent rows
# fill values in distance matrix
for (i in 1:m) {
    for (j in (i+1):m) {
        if (j > m) break
        vi <- igraph::compare(membership[i,], membership[j,], method = "vi")
        dist.matrix[i,j] <- vi
        dist.matrix[j,i] <- vi
    }
}

您可以使用 expand.grid 定义组合,应用计算值,并重塑以生成最终矩阵

df_combs <- expand.grid(1:nrow(membership), 1:nrow(membership))
df_combs$compare <- apply(df_combs, 1, function(x) igraph::compare(membership[x[1],], membership[x[2],], method = "vi"))
df_wide <- reshape(df_combs, direction = "wide", timevar = "Var1", idvar = "Var2")
df_wide$Var2 <- NULL

df_wide 等同于 dist.matrix.