【问题标题】:Is there a more efficient way to perform a function across sequential rows of a matrix?是否有更有效的方法来跨矩阵的连续行执行函数?
【发布时间】:2016-11-25 08:57:45
【问题描述】:

我希望计算矩阵的每一行与同一矩阵的每一行之间的variation of information。这个距离度量不包含在dist 中,所以我必须手动迭代。每一行是一个聚类,每一列是一个样本。矩阵的值为 {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
    }
}

【问题讨论】:

  • 您是要计算矩阵每一列或矩阵每一行之间的距离吗?
  • 每一行与其他行进行比较,创建一个维度等于行数的方阵。对角线上的值为 0,因为两个相同向量之间的距离为 0。外循环遍历所有行,内循环从当前行 +1 到最后一行。
  • 您似乎想在样品之间进行距离测量,对吗?然后你可以做 mn
  • 如果我不使用不同的方法,信息的变化,那会很好,dist 中不包含这些信息。
  • 如果你经常需要这个,用 Rcpp 实现它。

标签: r matrix distance


【解决方案1】:

您可以使用 expand.grid 来定义组合,使用 sapply 来计算值,然后重新整形以生成最终矩阵

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 相同。

【讨论】:

  • 比较干净一些,但似乎需要更长的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 2018-07-05
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多