2014-02-22 7 views
5

я могу сделать два уровня вложенного цикл, как этогоКак сделать произвольный уровень вложенного для цикла

for i1 in 1:n 
    for i2 in 1:n 
    do something with (i1,i2)  

Как продлить это в произвольный уровень вложенного цикла?

Например, я могу сделать это в Python в цикле декартово произведение п^т

for i in (itertools.product(xrange(n),repeat=m)): 

Как

for i in (itertools.product(xrange(2),repeat=3)): 
    print i 

(0, 0, 0) 
(0, 0, 1) 
(0, 1, 0) 
(0, 1, 1) 
(1, 0, 0) 
(1, 0, 1) 
(1, 1, 0) 
(1, 1, 1) 

Спасибо за @ Толи свой комментарий. Я успешно применил Iterators.jl. Я новичок Джулии, поэтому мой код может быть неуклюжим.

for i in product(repmat(Any[1:2],3)...) 
    println(i) 
end 

(1,1,1) 
(2,1,1) 
(1,2,1) 
(2,2,1) 
(1,1,2) 
(2,1,2) 
(1,2,2) 
(2,2,2) 

ответ

0

Как правило, рекурсия, в которой функция вызывает себя. У меня должен был быть более подробный вопрос, чтобы дать вам более подробный ответ.

+1

Спасибо. Я добавил пример Python, надеюсь, сделать его более понятным. –

1

Пакет Cartesian.jl может предоставлять функциональные возможности, которые вы хотите в определенной степени.

Я знаю очень мало о том, как его использовать, но я смог хотя бы воспроизвести тот же результат вашего кода на Python, однако это может быть недостаточно «произвольным», поскольку я не смог заменить 3 на тело цикла переменной.

julia> using Cartesian 
julia> @nloops 3 i d->0:1 begin 
      println(@ntuple 3 i) 
     end 
(0,0,0) 
(1,0,0) 
(0,1,0) 
(1,1,0) 
(0,0,1) 
(1,0,1) 
(0,1,1) 
(1,1,1) 

Надеюсь, кто-то хорошо знает, что этот пакет может дать лучший ответ.

Просто дополнительно: Джулия принимает это хороший синтаксис цикла:

julia> for i in 1:2, j in 1:3 
      println((i, j)) 
     end 
(1,1) 
(1,2) 
(1,3) 
(2,1) 
(2,2) 
(2,3) 
+0

Тем не менее, я думаю, что, вероятно, это гораздо более простой способ сделать это, или, по крайней мере, нетрудно написать функцию itertools.product в Julia. –

+4

Cartesian предназначен для написания высокопроизводительного кода. Если это то, что вы хотите, то это, вероятно, для вас --- нет ничего другого, что действительно даже близко с точки зрения производительности. Однако, если вы хотите, чтобы что-то было немного проще в использовании, попробуйте пакет Iterators.jl. Этот пакет в настоящее время недокументирован, но скрипт 'test.jl' должен помочь вам приступить к работе. – tholy

+1

Спасибо Я успешно применил Iterators.jl. Если вы можете сделать отдельную запись, я могу отметить ее как принятый ответ (и, возможно, перевести мой пример в принятый ответ). –

5

В v0.5 существует итератор продукт в базе, так что теперь вы можете написать это как Base.product(fill(1:2,3)...). fill создает массив со значением, повторяемым несколько раз; Я считаю это немного более элегантным, чем создание 1-элементного массива и вызов repmat.

 Смежные вопросы

  • Нет связанных вопросов^_^