Во-первых,
if условие … end
Во-вторых,
if условие … else … end
И, наконец, в форме
if условие1 … elseif условие2 … else … end
в которой ветвей с ключевым словом elseif может быть много.
Область действия условного оператора начинается ключевым словом if, а заканчивается ключевым словом end. Под условием понимается произвольное выражение (чаще всего это выражение включает в себя операции сравнения и логические операции), истинность или ложность которого понимается как отличие или равенство нулю.
Если условие истинно, то выполняются команды, стоящие после строки с ключевым словом if. Если условие ложно, то эти команды пропускаются и переходят либо к следующему за условным оператору (первая форма), либо проверяют ещё одно условие в строке с ключевым словм elseif (третья форма условного оператора), либо выполняются без дополнительных проверок команды, стоящие после строки с ключевым словом else (вторая из приведённых выше форм). Более побробных объяснений по работе условного оператора не требуется, так как перевод ключевых слов говорит сам за себя.
Однако требуются ещё кое-какие разъяснения, связанные с тотальным использованием в M-языке системы MATLAB массивов. Их можно использовать и в условных выражениях, входящих в условные операторы MATLABа. В тех случаях, когда значением таких выражений будет массив, истинность условия наступает, когда истинны (не равны нулю) все элементы массива. Если хоть один элемент такого массива будет равен нулю, то условие считается ложным. Кроме того, ложность имеет место при использовании пустых массивов.
Приведём иллюстрирующий работу условного оператора фрагмент кода
A = [ 1 2; 4 0 ]; if A b = 1; else b =2;
в результате выполнения которого переменная b получит значение 2, так как матрица A содержит один нулевой элемент, и всё условие считается ложным.
Кстати, запись if A по своему действию полностью эквивалентна записи if A~=0 и записи if all(A(:)).
Оператор переключения использует ключевые слова switch ("переключить"), case ("случай"), otherwise ("иначе") и имеет следующую конструкцию:
switch выражение case значение1 … case { значение2, значение3 } … … otherwise … end
Сначала вычисляется вырабатывающее скалярное числовое значение выражение, а затем полученный результат сравнивается с набором значений значение1, значение2, значение3 и так далее. В случае совпадения с одним из значений, выполняется нижестоящая ветка. Если нет совпадения ни с каким из перечисленных значений, то выполняется ветка, стоящая после ключевого слова otherwise. Строк с ключевым словом case может быть много, а строка с ключевым словм otherwise - одна.
Теперь рассмотрим операторы цикла, призванные циклически повторять участки программного кода. В зависимости от способа определения условия останова повторов различают два вида операторов цикла в M-языке системы MATLAB.
Первый из них использует ключевые слова for ("для") и end. Он имеет вид
while выражение … end
Здесь повтор участка кода, обозначенного многоточием, продолжается пока выражение истинно (не равно нулю). В случае массивов истинность наступает, когда все элементы массива истинны.
Следующий фрагмент вычисляет сумму отрезка ряда:
S=0; k=1; u=1;
while u > 1e-8
S = S + u;
k = k + 1; u = 1/k^2;
End
Условием останова служит требование к очередным слагаемым быть больше некоторого заранее определённого числа: как только слагаемое станет меньше этого числа, суммирование прекратится.
Другой вариант оператора цикла использует ключевые слова for (" для") и end. Он имеет вид:
for varName = выражение
…
End
где varName - произвольно выбираемое программистом имя так называемой переменной цикла. В отличие от первого варианта оператора цикла здесь легко прогнозировать количество итераций (повторов), так как тело цикла (обозначено многоточием) выполняется для всех возможных значений переменной varName. Набор возможных значений для переменной цикла поставляет выражение.
Чаще всего выражение представлено с помощью ранее изученной операции " диапазон значений ". В следующем фрагменте кода осуществляется сложение 57 членов ряда:
S=0;
for k = 1: 1: 57
S = S + 1/k^2;
End
При каждом новом проходе переменная цикла k увеличивается на единицу. Как легко заметить, здесь осуществляется суммирование того же ряда, что и в примере, посвящённом оператору цикла while…end. В предыдущем примере условием останова было требование к величине очередного слагаемого, а теперь этим условием является исчерпание всех возможных значений переменной цикла. В итоге можно сделать вывод, что использование того или иного варианта оператора цикла диктуется особенностями конкретной математической задачи.
Вместо операции задания диапазона можно явно указывать весь набор возможных значений в виде вектор-строки, например
for m = [ 2, 5, 7, 8, 11, 23 ]
что приведёт к шести итерациям. При первой итерации переменная цикла m будет равна 2, при втором - 5 и так далее до исчерпания всех возможных значений.
Достаточно необычным вариантом может показаться использование матриц в управляющем выражении:
A = [ 1 2; 3 4]; f
or k = A
Такой цикл будет повторяться ровно столько раз, сколько столбцов в матрице A, то есть два раза для данного конкретного случая. При каждом проходе переменная цикла принимает значение очередного столбца матрицы, то есть является вектор-столбцом.
Например, следующий фрагмент
S=0; A = [ 1 2; 3 4];
for k = A
S = S + sqrt(k(1)^2 + k(2)^2);
End
вычисляет сумму "длин" столбцов матрицы A. Оба вида операторов цикла можно прервать, если применить оператор break внутри тела цикла.
Для повышения эффективности программы везде, где это возможно, вместо операторов цикла лучше применять эквивалентные по результатам операции с массивами, так как последние исполняются в системе MATLAB быстрее. Например, вместо
k=0;
for x = 0: 0.1:100
k=k+1; y(k) = cos(x);
End
лучше использовать операции с массивами:
x = 0: 0.1: 100; y = cos(x);
так как они быстрее исполняются и записываются короче.
#$+Проверка входных параметров и выходных значений M-функции.
Как мы говорили выше, несовпадение типов и числа фактических и формальных параметров в M-функции приводит к их неправильной работе. Но "пользователь" M-функции всегда может ошибиться при её вызове. Поэтому желательно встраивать внутрь кода M-функций проверки входных параметров.
Ранее рассмотренная в пункте 2 функция MatrProc1 предполагала использовать в качестве первого и второго аргументов массивы одинаковых размеров. Если пользователь по ошибке задаст фактические параметры в виде массивов разных размеров, то в процессе выполнения функции возникнет ошибка. Чтобы избежать этого, можно в теле функции MatrProc1 организовать проверку размеров первого и второго параметров:
function [ A, B ] = MatrProc1(X1, X2, x)
if size(X1) ~= size(X2)
Дата добавления: 2015-01-18 | Просмотры: 606 | Нарушение авторских прав
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|