Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
Цикл for повторяет группу операторов для постоянного числа итераций. Цикл запускает с команды for и заканчивается end_for или только end. MuPAD® выполняет все операторы между этими двумя словами так много раз, как вы задаете. Например, вычислите факториал целого числа с помощью цикла:
x := 1: for i from 1 to 5 do x := x * i; end_for
![]()
Часто можно ускорять подписание кода MuPAD, заменяя циклы for на генератор последовательности $. Например, вместо цикла
x := 1: for i from 1 to 10 do x := x * i; end_for
![]()
используйте оператор:
`*`(i $ i = 1..10)
![]()
По умолчанию цикл постепенно увеличивает значение счетчика 1 на каждом шаге. Можно изменить размер шага:
for i from 1 to 3 step 1/2 do print(i) end_for
![]()
![]()
![]()
![]()
![]()
Чтобы считать в обратном направлении уменьшение значения счетчика с каждым шагом, вместо to, используют ключевое слово downto:
for i from 3 downto 1 do print(i) end_for
![]()
![]()
![]()
MuPAD поддерживает использование структур, таких как списки и матрицы в циклах for:
for i in [1, -4, a, b] do print(i^2) end_for
![]()
![]()
![]()
![]()
s := 0: for i in linalg::hilbert(3) do s := s + i^2 end_for
![]()
MuPAD поддерживает использование циклов с логическими условиями. Цикл while продолжается, в то время как условия выполнения допустимы. Цикл запускается с while и заканчивается end_while или только end. MuPAD выполняет все операторы между этими командами неоднократно, пока условия выполнения верны. В цикле while MuPAD оценивает условия перед каждой итерацией. Когда условие становится ложным, цикл останавливается, не выполняя операторы текущей итерации:
i := 2; while i < 16 do i := i^2; print(i) end_while:
![]()
![]()
![]()
Цикл repeat продолжается, пока условие завершения не становится допустимым. Цикл запускается с repeat и заканчивается end_repeat. MuPAD выполняет все операторы между этими командами неоднократно, в то время как условия являются ложными. Цикл repeat тестирует условие завершения в конце каждой итерации. Когда условие становится верным, цикл останавливается после выполнения операторов текущей итерации:
i := 2; repeat i := i^2; print(i) until i >= 16 end_repeat:
![]()
![]()
![]()
while и циклы repeat не действуют для постоянного числа шагов. Если условия выполнения или завершения таких циклов никогда не становятся верными, MuPAD может выполнить операторы в этих циклах бесконечно. Например, если условие завершения не допустимо во время первой итерации, и это не изменяется в цикле, цикл бесконечен:
i := 1; repeat print(i) until i > 3 end_repeat:
Чтобы избежать этого бесконечного цикла, используйте дополнительный оператор, чтобы изменить его в каждой итерации:
i := 1; repeat i := i + 1; print(i) until i > 3 end_repeat:
![]()
![]()
![]()
![]()
Можно использовать несколько условий, комбинирующих выражения and, or, xor или другими логическими операторами:
i := 2: j := 3: repeat i := i*j; j := j^2; print(i, j) until i > 100 and j > 10 end_repeat:
![]()
![]()
![]()
i := 2: j := 3: repeat i := i*j; j := j^2; print(i, j) until i > 100 or j > 10 end_repeat:
![]()
![]()
Можно поместить один или несколько циклов в другом цикле. Внутренние циклы могут иметь те же или различные типы:
s := 0:
for i from 1 to 3 do
for j from 1 to 2 do
s := s + i + j;
end_for
end_for:
print(s)![]()
s := 0:
for i from 1 to 3 do
j := 1:
while j <= 2 do
s := s + i + j;
j := j + 1;
end_while
end_for:
print(s)![]()
Чтобы добавить возможность выйти из цикла, используйте команду break. Предположим, что вы хотите выйти из цикла, если некоторое условие верно:
for i from 1 to 3 do
for j from 1 to 2 do
if i = j then
print(Unquoted, "i = j = ".expr2text(i));
break
end_if
end_for
end_for:i = j = 1
i = j = 2
Команда break позволяет вам выйти из цикла, в который вы помещаете эту команду. Если вы создаете вложенные циклы и используете break во внутреннем цикле, MuPAD продолжает выполнять операторы во внешних циклах:
for i from 1 to 3 do
for j from 1 to 2 do
if i = j then
print(Unquoted, "break with i = j = ".i);
break
end_if;
print(Unquoted, "i = ".i.", j = ".j);
end_for
end_for:break with i = j = 1
i = 2, j = 1
break with i = j = 2
i = 3, j = 1
i = 3, j = 2
Предположим, что вы хотите прекратить выполнить операторы и выходить из вложенных циклов, как только условие i = j верно. Используйте дополнительную переменную для состояния пропуска внутреннего цикла. Используйте эту переменную, чтобы выйти из внешнего цикла:
breakAll := FALSE:
for i from 1 to 3 do
for j from 1 to 2 do
if i = j then
print(Unquoted, "break with i = j = ".i);
breakAll := TRUE;
break
end_if;
print(Unquoted, "i = ".i.", j = ".j);
end_for;
if breakAll then
break
end_if;
end_for:break with i = j = 1
Чтобы пропустить команды от конкретной точки в конец цикла и запустить следующую итерацию, используйте команду next:
for i from 1 to 3 do
for j from 1 to 2 do
if i = j then
print(Unquoted, "i = j = ".expr2text(i));
next
end_if;
print(Unquoted, "i = ".expr2text(i), "j = ".expr2text(j))
end_for
end_for:i = j = 1
i = 1, j = 2
i = 2, j = 1
i = j = 2
i = 3, j = 1
i = 3, j = 2
Все команды MuPAD производят некоторые возвращаемые значения. Циклы в MuPAD возвращают результат последнего выполняемого оператора:
for i from 1 to 3 do x := 2*i; y := 3*i end_for
![]()
Подавите вывод возвращаемого значения с двоеточием:
for i from 1 to 3 do x := 2*i; y := 3*i end_for:
По умолчанию MuPAD не отображает промежуточные результаты, полученные в цикле, даже если вы используете точки с запятой после команд. Чтобы видеть промежуточные результаты, используйте команду print в цикле:
i := 1; while i < 3 do i := i + 1; print(i) end_while:
![]()
![]()
![]()
Чтобы отобразить результаты каждой итерации в цикле for, также используйте команду print:
for i from 1 to 5 do x := i!; print(Unquoted, expr2text(i)."! = ".expr2text(x)) end_for
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120