通过广播操作分配内存



我的循环高达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)

取决于您之后需要处理的事情。

最新更新