我有以下尴尬的循环,例如kreps=(8, 7, 6)
,一个Int的元组。我预先计算了一个多维数组kvec_wts
,它根据kreps
保存Float。使用OffsetArrays.jl,我可以非常漂亮地在循环中调用kvec_wts[ka, kb, kc]
!
for kc=-kreps[3]:kreps[3], kb = -kreps[2]:kreps[2], ka = 0:kreps[1]
if ka == 0
if kb < 0
continue
end
if kb == 0 && kc <= 0
continue
end
end
# do tons of computation involving `kvec_wts[ka, kb, kc]`
end
以下是我使用OffsetArrays.jl分配的方式:
kvec_wts = OffsetArray(zeros(Float64,
kreps[1] + 1,
2 * kreps[2] + 1,
2 * kreps[3] + 1),
0:kreps[1],
-kreps[2]:kreps[2],
-kreps[3]:kreps[3])
经过一些分析并发现this post显示有性能命中,在循环中存储和访问数组kvec_wts
的更美妙的方法是什么?
问题是我的代码中的一些位置出现了尴尬的循环,并且假设索引依赖于for循环的顺序似乎很危险......对吗?有没有办法为for循环编写代码?解决方案是自定义迭代器,还是某种类型的宏,以确保再现相同的for循环,那么我可以为kvec_wts
设置一维数组?感谢。