避免使用for循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了避免使用for循环相关的知识,希望对你有一定的参考价值。

我正在使用R,我有一个这样的代码:

for (i in 1:10)
   for (j in 1:100)
        if (data[i] == paths[j,1])
            cluster[i,4] <- paths[j,2]

其中:

  • data是一个包含100行和1列的向量
  • paths是一个包含100行和5列的矩阵
  • cluster是一个包含100行和5列的矩阵

我的问题是:我怎么能避免使用“for”循环迭代矩阵?我不知道apply函数(lapplytapply ......)在这种情况下是否有用。

例如,当j=10000这是一个问题,因为执行时间很长。

谢谢

答案

内环可以被矢量化

cluster[i,4] <- paths[max(which(data[i]==paths[,1])),2]

但检查Musa的评论。我认为你缩进了别的东西。

通过复制矢量,可以对第二(外部)循环进行矢量化

  1. 如果i只有100,你的加速不会很大
  2. 它需要更多的RAM

[编辑]据我了解你的评论你可以只使用逻辑索引吗?

indx <- data==paths[, 1]
cluster[indx, 4] <- paths[indx, 2]
另一答案

我认为可以使用以下方法对两个循环进行矢量化:

cluster[na.omit(match(paths[1:100,1],data[1:10])),4] = paths[!is.na(match(paths[1:100,1],data[1:10])),2]

以上是关于避免使用for循环的主要内容,如果未能解决你的问题,请参考以下文章

js数组遍历方法总结

避免使用for循环

如何使用引导程序和 for 循环在 django 中创建电影片段?

如何在Django视图中使用for循环返回每次迭代[关闭]

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始

for循环结构