我的循环高达100000,每次找到与某个标准匹配的数字索引。
x是浮子的数组。
x = [0.1,0.3,-0.2, 0.4,0.0, 0.9,1.1]
for i = 1:n
cr = max(0.0, 0.2*sqrt(i) - 20)
ftt = findall(x .<= cr)
#I have other things here but they are not necessary
end
如何通过在循环中使用Findall避免内存分配?
由于 findall
返回一个可变大小的索引数组,因此您编写的本质上涉及分配的方式:必须分配一系列索引。但是,如果您要为每个索引做某事,那么您可以使用循环,例如:
x = [0.1,0.3,-0.2, 0.4,0.0, 0.9,1.1]
for i = 1:n
cr = max(0.0, 0.2*sqrt(i) - 20)
for (index, item) in enumerate(x)
item <= cr || continue
# do something with index, item
end
end
这不分配内存,因为它在每个索引和项目上都有一个,而不是一次返回它们。
问题是:
x .<= cr
创建一个临时布尔阵列x
的大小。
为了避免这种情况,您可以使用理解(和enumerate()
与值一起产生索引(:
[i for (i, x_i) in enumerate(x) if x_i <= cr]
或发电机(请参阅 @bogumiłkamiński评论(:
(i for (i, x_i) in enumerate(x) if x_i <= cr)
取决于您之后需要处理的事情。