如果不是OffsetArrays.jl那么如何存储和访问具有不规则for循环的数组?

时间:2018-04-28 05:20:59

标签: julia

我有以下尴尬的循环,例如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设置一维数组?感谢。

0 个答案:

没有答案
相关问题