2017-02-15 5 views
0

Я имею дело с проблемой, для которой изначально мне нужно было использовать вложенный цикл for. Мне было интересно, есть ли способ объединить большое количество циклов for в один.Сочетание многих для циклов в одном

Чтобы добавить к этому, я нашел ответ here, но для этого требуется сначала создать все возможные комбинации, что может быть плохо с точки зрения требований к памяти. Мои for петли состоят из множества переменных, независимых друг от друга, с которым функция затрат вычисляется, например:

for x1 = 1:10 
    for x2 = 2:15 
     for x3 = 3:5 
      for x4 = 7:9 
       %and so on 
       cost = J(x1, x2, x3, x4) %or more 
      end 
     end 
    end 
end 

Если я знаю заранее, сколько переменных нужно использовать, есть способ сделать это блок проще?

+6

Вы можете оптимизировать петли * в зависимости * от того, что он делает , Если бы общий способ создания вложенных циклов был одним, тогда не было бы вложенных циклов для начала. Также старайтесь избегать ненужного формирования. –

+3

Добавить к моему предыдущему комментарию. Практически вся оптимизация кода будет основываться на слабом балансе между памятью и вычислительным временем. Как правило, вам нужно выбрать один и знать, что другой, вероятно, будет хуже. –

+2

Другой альтернативой является изменение 'J()' для принятия векторов и возврат n-dim (n - количество заданных переменных) тензора, но это также возвращается к балансу между памятью и временем. – mpaskov

ответ

1

Следующая функция делает работу, но это будет медленнее, чем исходный код

function loop(f, args, varargin) 
if ~isempty(args) 
    for arg = args{1} 
     loop(f, args(2:end), varargin{:}, arg); 
    end 
else 
    f(varargin{:}); 
end 

Вы можете начать свой расчет с

loop(@J, {1:10, 2:15, 3:5, 7:9}); 
+0

Это может сделать мой код медленнее, но это очень аккуратное решение, поэтому я принимаю этот ответ. – nikaltipar