我有一个循环,最高可达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避免内存分配?
由于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)
这不会分配内存,因为它对每个索引和项目进行操作,一次操作一次,而不是一次返回所有索引和项目。