Лекция: Во-первых,

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 )

error( 'Bad 1st and 2nd parameters' )

End

A = X1 .* X2 * x;

B = X1 .* X2 + x;

Теперь при вызове функции MatrProc1 с неправильными размерами первого и второго аргументов, стандартная функция системы MATLAB error будет корректно останавливать всю работу и выводить в командное окно MATLABа наше диагностическое сообщение ( аргумент функции error ), после чего пользователю останется лишь повторно вызвать функцию MatrProc1, но уже с правильными параметрами.

Затем нужно добавить ещё проверку третьего параметра на скалярность, что можно выполнить следующим фрагментом кода:

[ m ,n ] = size( x );

if ( m ~=1 | n ~= 1 )

error( 'Bad 3d parameter' )

End

Наконец, неплохо проверить общее число параметров, с которыми функция была вызвана. Для этой цели в системе MATLAB специально предусмотрена переменная с именем nargin. Её значением является количество аргументов, фактически переданное функции при вызове. Тогда проверка на число параметров выполняется следующим образом:

if nargin ~= 3

error( 'Bad number of parameters' )

End

Более того, в системе MATLAB предусмотрена переменная nargout, содержащая число возвращаемых значений, предполагающихся в реальной форме вызова этой функции. Например, вызов

[ s1, s2, s3 ] = MatrProc1( x1, x2, x)

предполагает получить аж три возвращаемых значения, в то время как из определения функции следует, что возвращаемых значений у этой функции два. Чтобы предупредить пользователя функции о несовпадении числа ожидаемых возвращаемых значений их номинальному числу, нужно в теле функции осуществить проверку переменной nargout:

if nargout ~= 2

error( 'Must be 2 return values' )

End

Осуществлённые нами проверки приводят к тому, что функцию можно вызвать только с правильным числом входных параметров и возвращаемых значений. Однако ранее мы встречались со встроенными функциями системы MATLAB, которые могли быть вызваны с разным числом входных параметров ( и это очень типично ). В результате фактически разные работы бликого типа выполняются под одним и тем же именем функции, что весьма наглядно и удобно. Таковой, например, является функция plot, имя которой говорит о построении графиков функций. Если бы разные варианты вызовов этой функции пришлось бы осуществлять под разными именами, то от наглядности не осталось бы и следа.

Подведём итог этим рассуждениям: когда функция допускает многовариантность работы при разном числе входных аргументов, это нужно предусмотреть при проверках их числа, и вместо прекращения работы функции осуществить разные ветви выполнения. То же касается и числа возвращаемых значений. В определении функции при этом нужно использовать максимально возможное число как первых, так и вторых. Так, функция

function [ res1, res2] = TestFunc2( var1, var2 )
switch nargin
case 1
if nargout == 1, res1 = var1 * 2;
elseif nargout == 2, res1 = var1 * 2; res2 = var1 + 3;
else error( 'Must be 1 or 2 return values' );
end
case 2
if nargout == 1, res1 = var1 .* var2;
elseif nargout == 2, res1 = var1 .* var2; res2 = var1 + 3;
else error( 'Must be 1 or 2 return values' );
end
otherwise error( 'Must be 1 or 2 parameters' );
end

допускает много вариантов корректных вызовов. Для краткости мы здесь опустили проверку размеров входных параметров, подробно рассмотренную выше. Кроме того, мы здесь намеренно для большей наглядности выполняем некоторую лишнюю работу: на практике MATLAB самостоятельно отслеживает ситуацию превышения числа параметров и возвращаемых значений над номинальным их числом.

В заключение отметим, что степень подробности проверок зависит от предназначения функции. Если M-функция пишется для собственного потребления, проверки могут быть менее строгими. Но если предполагается передача функции для внешнего потребления, то проверки нужно сделать более жёсткими, так как внешнему пользователю трудно разобраться во всех деталях работы вашей функции.

function [ res1, res2] = TestFunc2( var1, var2 )
switch nargin
case 1
if nargout == 1, res1 = var1 * 2;
elseif nargout == 2, res1 = var1 * 2; res2 = var1 + 3;
else error( 'Must be 1 or 2 return values' );
end
case 2
if nargout == 1, res1 = var1 .* var2;
elseif nargout == 2, res1 = var1 .* var2; res2 = var1 + 3;
else error( 'Must be 1 or 2 return values' );
end
otherwise error( 'Must be 1 or 2 parameters' );
end


#$+Видимость имён переменных и имён функций.

Локальные и глобальные переменные. Функция располагает собственным, изолированным от рабочего пространства системы MATLAB, пространством переменных. Поэтому, если перед вызовом M-функции в командном окне MATLABа была определена переменная с именем, например, varName1, то нельзя рассчитывать на то, что переменная в теле функции с этим же именем уже имеет некоторое значение. Это совсем другая переменная ( хотя у неё и то же самое имя varName1 ) и располагается она в памяти машины в другой области памяти.

Переменные, которые используются в теле M-функции и не совпадают с именами формальных параметров этой функции, называются локальными. По-другому говорят, что они видимы лишь в пределах M-функции. Извне они не видны ( не достижимы ). Внутри функции не видны переменные, определённые в командном окне MATLABа — они являются внешними по отношению к функции и не видны в ней.

Аналогично, локальные внутри некоторой функции переменные не видны внутри другой M-функции.

Одним из каналов передачи информации из командного окна системы MATLAB в M-функцию и из одной функции в другую является механизм параметров функции. Другим таким механизмом являются глобальные переменные.

Чтобы рабочая область системы MATLAB и несколько M-функций могли совместно использовать переменную с некоторым именем, её всюду нужно объявить как глобальную с помощью ключевого слова global. К примеру, переменная glVarS, участвующая в вычислениях в рабочем пространстве и в функции FuncWithGlobVar является одной и той же переменной ( единственный участок памяти ) повсюду — поэтому её можно использовать в функции без дополнительного присваивания её какого-либо значения:

 

Так как у глобальных переменных «глобальная» область действия, то чтобы случайно ( по ошибке ) не переопределить её где-либо, желательно давать таким переменным более мнемонические ( более длинные и осмысленные ) имена.

Теперь рассмотрим вопрос о видимости имён функций. Если мы сохранили функцию с некоторым именем в файле с этим же именем и расширением m, и кроме того если системе MATLAB известен путь к этому файлу на диске, то эту функцию можно вызывать как из командного окна, так и из других функций.

Однако в тексте M-функции можно поместить опеределения нескольких функций, причём только одна из них может совпадать по имени с именем файла. Именно эта функция и будет видна из командного окна и других функций. Все остальные функции будут внутренними — их могут вызывать только функции из того же файла.

Например, если в файле ManyFunc.m будет содержаться следующий текст

function ret1 = ManyFunc( x1, x2 )

ret1 = x1 .* x2 + AnotherFunc( x1 )

function ret2 = AnotherFunc( y )

ret2 = y .* y + 2 * y + 3;

состоящий из определений двух функций с именами ManyFunc и AnotherFunc, то извне можно вызывать только функцию ManyFunc. По-другому можно сказать, что извне видны только функции с именами, совпадающими с именами M-файлов. Остальные функции должны вызываться этой функцией и другими внутренними функциями.


#$+Разработка и отладка M-функций.

Разрабатывая функцию, вы в первую очередь разрабатываете алгоритм решения некторой задачи, после чего переводите его на формальный язык кодирования, которым и является M-язык. Несмотря на довольно высокую наглядность M-языка ( отсутствуют низкоуровневые конструкции, близкие к машинным командам ), всё равно это формальный язык. По прошествии времени детали разработок забудутся и для модификации функции придётся всё вспоминать снова.

Чтобы упростить процесс дальнейшей модификации функции, а также её отладки на стадии, когда ещё не удалось добиться правильной работы, в текст функции вставляют комментарии.

Комментарии могут занимать отдельные строки, начинающиеся с символа %, после которого следует текст комментария. Также комментарии можно располагать в конце любой строки кода, поскольку интерпретатор M-языка, встретив знак %, считает все символы после него просто комментарием ( а не командами, подлежащими переводу в машинную форму и исполнению ).

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

еще рефераты
Еще работы по информатике