Как перейти к определенному месту в цикле for, если условие if выполнено? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть несколько файлов изображений. Я пытаюсь выполнить некоторые вычисления, используя каждый файл, и если определенное условие выполнено, я хотел бы вернуться к определенной строке в коде и запустить ее оттуда еще раз. Но только еще раз. Независимо от того, удовлетворяется ли условие if во второй раз или нет, я хочу перейти к следующей итерации. Но у MATLAB, похоже, нет функции goto, а также использование goto подразумевает плохое программирование, поэтому я подумал, что просто дважды выполним цикл for для конкретного значения i, которое удовлетворяет условию if.

file = dir('*.jpg');
n = length(file);
for i = 1:n
    *perform some operations on the 'i'th file*
    if 'condition'
        *run the for loop again for the 'i'th file instead of going to the 'i+1'th file*
         i=i-1;
    else
        *go to next iteration*
    end
end

Я попытался закодировать это, изменив переменную цикла 'i' внутри цикла на 'i-1', так что на следующей итерации цикл i будет повторяться снова, но это дает неверный результат вывод, хотя я не знаю, есть ли какая-то другая ошибка в моем коде или причиной является изменение внутренней переменной цикла. Любая помощь по этому вопросу приветствуется.

Ответы [ 2 ]

4 голосов
/ 12 апреля 2019

Замените цикл for на цикл while, чтобы иметь немного больше гибкости. Единственное отличие состоит в том, что вы должны вручную увеличивать i, следовательно, это также позволяет вам не увеличивать i.

Учитывая ваше новое требование, вы можете отслеживать количество попыток и легко изменить это при необходимости:

file = dir('*.jpg');
n = length(file);

i = 1;
attempts = 1; 

while i <= n
    % perform code on i'th file
    success =  doSomething(); % set success true or false;

    if success
        % increment to go to next file
        i = i + 1;

    elseif ~success && attempts <= 2 % failed, but gave it only one try
        % increment number of attempts, to prevent performing 
        attempts = attempts + 1;
    else % failed, and max attempts reached, increment to go to next file
        i = i + 1;
        % reset number of attempts 
        attempts = 1;
    end
end
1 голос
/ 12 апреля 2019

Учитывая новое требование, добавленное после ответа Ринкерта , самым простым подходом становится отделение кода от вашего цикла в отдельной функции:

function main_function

  file = dir('*.jpg');
  n = length(file);
  for i = 1:n
    some_operations(i);
    if 'condition'
      some_operations(i);
    end
  end

  function some_operations(i)
    % Here you can access file(i), since this function has access to the variables defined in main_function
    *perform some operations on the 'i'th file*
  end

end % This one is important, it makes some_operations part of main_function
...