У меня есть несколько файлов изображений. Я пытаюсь выполнить некоторые вычисления, используя каждый файл, и если определенное условие выполнено, я хотел бы вернуться к определенной строке в коде и запустить ее оттуда еще раз. Но только еще раз. Независимо от того, удовлетворяется ли условие 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 будет повторяться снова, но при этом получается неправильный вывод, хотя Я не знаю, есть ли какая-то другая ошибка в моем коде или внутреннее изменение переменной цикла является причиной проблемы. Любая помощь по этому вопросу приветствуется.

0
Matte 12 Апр 2019 в 19:05

2 ответа

Лучший ответ

Замените цикл 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
4
rinkert 12 Апр 2019 в 16:57

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

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
1
Cris Luengo 12 Апр 2019 в 16:47