для цикла - размеры блоков не перекрываются - PullRequest
0 голосов
/ 03 июня 2018

Я работаю над проблемой, когда я выполняю вычисления для блоков различной ширины, скажем, блоков 8,16,32 .... 1024

Итак, давайте посмотрим, как блоки будут выглядеть для ширины блоков8:

size_8 = collect(1:8:1024)

julia> print(size_8)
[1, 9, 17, 25, 33, 41, 49, 57, 65, 73, 81, 89, 97, 105, 113, 121, 129, 137, 145, 153, 161, 169, 177,
 185, 193, 201, 209, 217, 225, 233, 241, 249, 257, 265, 273, 281, 289, 297, 305, 313, 321, 329, 337,
 345, 353, 361, 369, 377, 385, 393, 401, 409, 417, 425, 433, 441, 449, 457, 465, 473, 481, 489, 497,
 505, 513, 521, 529, 537, 545, 553, 561, 569, 577, 585, 593, 601, 609, 617, 625, 633, 641, 649, 657,
 665, 673, 681, 689, 697, 705, 713, 721, 729, 737, 745, 753, 761, 769, 777, 785, 793, 801, 809, 817,
 825, 833, 841, 849, 857, 865, 873, 881, 889, 897, 905, 913, 921, 929, 937, 945, 953, 961, 969, 977,
 985, 993, 1001, 1009, 1017]

Итак, первый блок - 1: 9, второй - 9:17, третий - 17:25 и так далее.

Далее я хочу разместить эти значения ширины блока в цикле for с помощью итератора i.Я не хочу жестко кодировать как size_8[i]:size_8[i]+8 Это потому, что я хочу циклически проходить каждое значение n, 8,16,32.... 1024 Я не хочу кодировать целую кучу векторов size_8, size_16, size_32 .... size_1024.Я бы предпочел перебирать каждое значение размера блока n.

Если мы возьмем циклический цикл, мы можем сделать:

n=8 # set width of rolling window
for i = n:size(something,1) 
out[i] = mean(something[i-n+1:i] 
end 

это ширина окна 8, это длясверх размера блока перекрытия для увеличения i (i+1) и, как я собираюсь описать, нужно увеличивать i на 8 каждый раз:

Так что теперь в вышеуказанной проблеме мне нужно увеличить iна 8 каждый раз против 1 (что теперь я понимаю, что это невозможно), начиная с позиции 1, а также увеличивая верхнее окно на 8 каждый раз, так что мы имеем:

сделать что-то, сказать среднеена 1:9 range, 9:17 range, 17:25 .... и т. д. и т. п. - не перекрывающих друг друга блоков.

У кого-нибудь есть идеи, как мне добиться успеха без жесткого кодирования диапазонов векторов и использования только итераторов i?Я пытался закодировать жестко закодированные блоки, но это слишком ограничительно.

1 Ответ

0 голосов
/ 03 июня 2018

Я подумал, что мог бы сделать динамический block_size внутри самого цикла:

block_size = [8,16,32,64,128,256,512,1024]

 for i in 1:length(block_size)
    size = collect(1:block_size[i]:length(something))
    print(size)
    end

Теперь я могу для любого n:

size[i]:size[i]+n
...