【问题标题】:Avoid a for loop避免 for 循环
【发布时间】:2016-02-15 08:32:42
【问题描述】:

我正在尝试优化算法,我真的想避免所有循环。因此,我想知道是否有办法避免以下简单循环:

library(FNN)
data <- cbind(1:10, 1:10)

NN.index <- get.knn(data, 5)$nn.index
bc <- matrix(0, nrow(NN.index), max(NN.index))
for(i in 1:nrow(bc)){
  bc[i,NN.index[i,]] <- 1
}

bc 是一个零矩阵。

【问题讨论】:

  • 代码对我来说看起来不错。我不会改变它。

标签: r apply lapply sapply tapply


【解决方案1】:

在R中,如果矩阵M的括号取k×2矩阵'I',则k×2矩阵I的每一行都被识别为M。例如

M = matrix(1:20, nrow =4, ncol = 3)
print(M)
I = rbind(c(1,2), c(4,2), c(3,3))
print(M[I])

在这种情况下,M[1,2]M[4,2]M[3,3] 被提取。 在您的情况下,我们可以如下从NN.index 创建row_indexcol_index,然后将1 分配给相应的条目。

bc <- matrix(0, nrow(NN.index), max(NN.index))
row_index <- rep(1:nrow(NN.index), times = ncol(NN.index))
col_index <- as.vector(NN.index)
bc[cbind(row_index, col_index)] <- 1
print(bc)

【讨论】:

  • 感谢答案,我有点整理出来,我相信这样做(就计算能力而言)的原始方法是定义一个稀疏矩阵。在稀疏矩阵中,你给出了一个 i 的向量和一个 j 的向量,它们定义了矩阵的非零元素,你还可以定义一个向量 x,它代表非零元素。再次感谢!
猜你喜欢
  • 2023-03-27
  • 2012-06-25
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2017-11-11
  • 2018-03-15
  • 1970-01-01
相关资源
最近更新 更多