итерация через несколько интервалов Matlab

Я хотел бы создать цикл в Matlab, который работал бы только через определенные пользователем интервалы времени, а не просто все время. Как можно написать это условие цикла?

С уважением


person beginh    schedule 20.07.2012    source источник
comment
Что вы имеете в виду под временем? Фактическое время, затраченное на выполнение цикла, или индекс массива, который вы перебираете в цикле?   -  person Isaac    schedule 20.07.2012
comment
Я имею в виду, что я запускаю цикл для итераций 1–200, и я хочу создать условие, что итерация будет выполняться для интервала, например, 30–50, а затем 100–120. Поэтому я бы хотел прервать выполнение цикл для оставшихся интервалов, но не прерывать его полностью. это возможно?   -  person beginh    schedule 24.07.2012
comment
Чем это отличается от ответа @High Performance Mark ниже?   -  person Isaac    schedule 24.07.2012
comment
извините, я описал это не совсем правильно. он отличается тем, что в ответе ниже я даю определенные известные интервалы, тогда как я хочу получить эти интервалы, проверяя состояние значений, помещенных в ячейки структуры. Итак, я полагаю, мне нужен оператор «если». как мне тогда писать плавно?   -  person beginh    schedule 24.07.2012
comment
Как мой ответ ниже? Что вы имеете в виду под словом «плавно»?   -  person Isaac    schedule 24.07.2012


Ответы (3)


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


Во-первых, используя простой цикл For.

Общий синтаксис for index = 1:someValue

someValue в данном случае действительно может быть чем угодно, что больше 1. Часто это просто последнее значение индекса матрицы, которую вы хотите пройти.

Вы также можете изменить это! Допустим, вы хотите, чтобы каждый 3-й индекс начинался со 2-й позиции в матрице. Все, что вам нужно сделать, это: for index = 2:3:someValue Здесь 3 указывает циклу, что он должен добавить 3 к index в конце каждой итерации цикла, пока вы не дойдете до (или не превзойдете) someValue.

Еще одна модификация идет в обратном направлении. В этом случае вы начинаете с «конца» и переходите к началу. Это будет выглядеть так: for index = someValue:-1:1 Вы также можете выполнять каждый 4-й индекс, двигаясь назад for index = someValue:-4:1.

Очевидно, вы можете заменить значение между двумя : на нужный размер шага. Вам просто нужно знать о потенциальных проблемах с индексированием, которые могут возникнуть. А именно попытка индексации за пределы матрицы или потенциально отрицательная.


Во-вторых, здесь вы можете изменить значение внутри самого цикла. Как правило, это не лучшая идея, когда вы используете цикл for, поскольку значение вашей индексирующей переменной будет изменяться циклом, а также вами внутри цикла. Много раз вы увидите, что это делается с помощью while цикла или do while комбо.

Вот несколько примеров:

index = 0;
do
{
% some operations
index = index + aNumber;
}while(index <= someValue)

В приведенном выше примере цикл будет продолжать цикл до тех пор, пока значение индекса index не станет больше или равным someValue в конце текущей итерации цикла. Этот тип цикла будет ВСЕГДА, и я повторяю, ВСЕГДА выполняется хотя бы один раз.

index = 0;
while(index <= someValue)
{
%some operations
index = index + aNumber;
}

В этом случае цикл продолжится, пока index удовлетворяет логическому утверждению здесь. Если утверждение неверно, когда вы пытаетесь запустить цикл в первый раз, он вообще не будет выполняться.


Надеюсь, это поможет, и не стесняйтесь просить дополнительных разъяснений, если вы этого хотите!

Другие, пожалуйста, отредактируйте, чтобы добавить дополнительную информацию или очистить то, что я, возможно, не объяснил полностью =)

person Community    schedule 20.07.2012

Вы имеете в виду что-то вроде этого:

for i = [1:5 7:10 12:14 21:22]
   do_func(i)
end

или даже

for i = [1:5 4:7 19:-1:15]
   do_func(i)
end

?

person High Performance Mark    schedule 20.07.2012

Если вы хотите выполнить действие только при выполнении определенного условия в цикле, вам просто нужно что-то вроде:

for i=1:length(arr)
    if condition(arr(i))
        do_something(arr(i));
    end
end
person Isaac    schedule 24.07.2012
comment
спасибо, решает проблему! Я пошел в этом направлении и создал двойной цикл. сначала идет до указанной верхней границы, внутренняя итерация от верхней границы до нижней с уменьшением. - person beginh; 26.07.2012