我正在尝试优化算法,我真的想避免所有的循环。因此,我想知道是否有办法避免以下简单循环:
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
是一个零的矩阵。
答案 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_index
和NN.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)