если не OffsetArrays.jl, то как хранить и обращаться к массиву с нерегулярным для цикла? - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть следующее неудобное для цикла, и, например, kreps=(8, 7, 6), кортеж Int. Я предварительно вычислил многомерный массив kvec_wts, который содержит число с плавающей точкой в ​​зависимости от kreps. С 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]) 

После некоторого профилирования и поиска в этом посте , показывающем, что производительность падает, каков более красивый способ хранения и доступа к массиву kvec_wts внутри цикла?

Проблема в том, что неудобный для меня цикл появляется в нескольких местах в моем коде, и кажется опасным предполагать индексирование, зависящее от порядка цикла for ... Верно? Есть ли способ написать код для цикла for? Если бы решение было пользовательским итератором или каким-то макросом, чтобы всегда быть уверенным, что воспроизводится один и тот же цикл for, тогда я могу просто иметь одномерный массив для kvec_wts? Спасибо.

...