У меня есть следующее неудобное для цикла, и, например, 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
? Спасибо.