【问题标题】:Identify 1-digit nearest neighbors for each row in large matrix为大矩阵中的每一行识别 1 位最近邻
【发布时间】:2014-11-20 23:46:46
【问题描述】:

假设一个由 0 和 1 组成的矩阵:

library(gtools)
mat<-permutations(n = 2, r = 5, v = c(0,1), repeats.allowed = TRUE)
mat<-cbind(mat, round(runif(nrow(mat)), digits = 2))

我想遍历mat 的每一行并识别其 1 位最近邻(即所有仅相差 1 个数字的字符串)并将最后一列的相应值存储在单独的向量中。

目前我正在使用以下代码:

results <- matrix(NA, ncol = 6, nrow = nrow(mat))
N = ncol(mat)-1
for ( i in 1:nrow(mat)){ #for each row in the matrix
a <- as.vector(mat[i, 1:N]) #select a single row
res <- sapply(1:nrow(mat), function(x) mat[x, 1:N] == a) #cound how many elements match each row
results[i, ]<-c(mat[colSums(res) == N-1, N+1], mat[i, N+1])  #identify those rows that differ max 1 digit and store the value in the last column
}

对于较大的目标向量(即 permutations 中较大的 r),我的代码需要很长时间才能运行。 有什么方法可以更有效地做到这一点?

【问题讨论】:

  • 也许你可以制作一个更小的“垫子”供人们试用他们的代码,而不是当前的 32768*16 野兽。干杯。
  • 好的,我换了个更小的。只是想用较大的来说明需要多长时间。
  • 你能假设mat包含所有长度为r的位串吗?如果是这样,您可以明确地找到最近的邻居,而无需每次都遍历整个数组。
  • 是的,mat 总是包含所有可能的组合。所以你建议的解决方案会很棒!

标签: r matrix


【解决方案1】:

假设mat包含所有长度为r的位串并且是有序的,如示例所示(如果它没有排序,你可以对其进行排序),那么你可以显式计算邻居的索引而不用去在整个阵列上。例如:

m0<-mat[,-ncol(mat)]
bitflips<-diag(ncol(m0))
powers<-2^(ncol(m0):1-1)
neighbors<-t(apply(m0,1,function(x) {sort((powers %*% ((x + bitflips) %% 2)) +1)}))
results<-mat
results[,-ncol(mat)]<-results[neighbors,ncol(mat)]

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多