通过广播操作分配内存

kki*_*rui 3 julia

我有一个循环,最高可达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
Run Code Online (Sandbox Code Playgroud)

如何在循环中使用findall避免内存分配?

Ste*_*ski 5

由于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
Run Code Online (Sandbox Code Playgroud)

这不会分配内存,因为它对每个索引和项目进行操作,一次操作一次,而不是一次返回所有索引和项目。