避免使用for循环

时间:2016-02-15 08:32:42

标签: r apply lapply sapply tapply

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

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是一个零的矩阵。

1 个答案:

答案 0 :(得分:1)

在R中,如果矩阵M的括号采用k-by-2矩阵“I”,那么k-by-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]。 在您的情况下,我们可以从row_index创建col_indexNN.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)