Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Передача данных через глобальные переменные.
Поскольку переменные в файлах-функциях являются локальными, то передача данных из модуля в модуль происходит только через входные и выходные параметры. Команда
Global X Y Z
объявляет переменные X, Y, Z модуля-функции глобальными. Чтобы несколько программных модулей могли совместно использовать глобальную переменную, ее идентификатор должен быть объявлен как global во всех этих модулях.
Параметры функционального типа. Часто во многих функциях возникает необходимость передачи им в качестве параметров имени других функций. Например, необходимо написать функцию для вычисления интеграла, когда вид подынтегральной функции заранее не известен. В таких случаях в MATLAB используют параметры функционального типа. Описание переменной функционального типа имеет вид: fhandle = @ fname; Здесь имя fname – функции, @ fname – дескриптор (указатель) функции, fhandle – переменная функционального типа. Для определения значение функции с помощью ее функционального указателя можно использовать функцию feval, имеющую структуру:
feval ( fhandle, arg1, arg2, ..., argn )
Рассмотрим пример:
s = @ sin; sin ( 1 ) ans = 0. 8415 feval(s, 1) ans = 0. 8415 Напишем функцию для вычисления суммы , когда вид функции F(x) заранее неизвестен.
function f = sm ( fh ) f = 0; for i = 1: 10 f = f + feval ( fh, i); end;
Тогда для вычисления суммы, например функции sin ( x ), достаточно выполнить оператор:
sm (@ sin ) ans = 1. 4112
Функции с переменным числом аргументов. При создании функций с переменным числом аргументов полезно использовать две функции: · nargin – возвращает число входных параметров данной функции · nargout – возвращает число выходных параметров данной функции
В качестве примера рассмотрим часть кода функции myplot с переменным числом аргументов:
function [ x0, y0 ] = myplot ( fname, lims, npts, angl, subdiv ) % MYPLOT График функции. % MYPLOT( fname, lims, npts, angl, subdiv ) % Первые два аргумента обязательны, % три других имеют значение по умолчанию. ... if nargin < 5, subdiv = 20; end if nargin < 4, angl = 10; end if nargin < 3, npts = 25; end ... if nargout == 0 plot ( x, y ) Else x0 = x; y0 = y; End Управление потоками. MATLAB имеет пять видов структур управления потоками:
· оператор if · оператор switch · циклы for · циклы while · оператор break
Оператор if имеет следующую структуру:
If expression1 Statements Elseif expression2 Statements Else Statements End
Оператор if вычисляет логическое выражение expression1 и выполняет группу операторов statements, если выражение истинно. Необязательные ключевые слова elseif и else служат для выполнения альтернативных групп операторов. Ключевое слово end, которое согласуется с if, завершает последнюю группу операторов. Рассмотрим в качестве примера построение квадратной трехдиагональной матрицы, которая возникает при аппроксимации производной второго порядка на равномерной сетке узлов:
for i=1: 5 for j=1: 5 if i == j a(i, j) = 2; elseif abs(i–j) == 1 a(i, j) = – 1; else a(i, j) = 0; End End End
a
a =
2 -1 0 0 0 -1 2 -1 0 0 0 -1 2 -1 0 0 0 -1 2 -1 0 0 0 -1 2 Оператор switch имеет следующую структуру:
switch switch _ expr case case _ expr statement,..., statement case {case _ expr1, case _ expr2, case _ expr3,...} statement,..., statement ... Otherwise statement,..., statement End
Оператор switch выполняет группу операторов, базируясь на значении переменной или выражении switch _ expr. Ключевые слова case и otherwise разделяют эти группы. Выполняется только первый соответствующий случай. Необходимо использовать end для согласования с switch. Предыдущий пример можно переписать, используя оператор switch следующим образом:
for i=1: 5 for j=1: 5 Switch i–j Case 0 a ( i, j ) = 2; case { 1, –1 } a ( i, j ) = –1; Otherwise a ( i, j ) = 0; End End End В отличие от языка Си, оператор switch в MATLAB “не проваливается”. Если первый случай является истинным, другие случаи не рассматриваются. Таким образом, нет необходимости использовать оператор break.
Оператор цикла for повторяет группу операторов фиксированное число раз. Ключевое слово end ограничивает тело цикла. Циклы могут быть вложенными, как показано в предыдущем примере.
Оператор цикла while повторяет группу операторов определенное число раз, пока выполняется логическое условие. Ключевое слово end ограничивает тело цикла. Рассмотрим программу, иллюстрирующую работу операторов while и if для нахождения одного из корней многочлена x3-2x-5. В программе реализован метод дихотомии.
a = 0; fa = –Inf; b = 3; fb = Inf; while b–a > eps*b x = ( a+b)/2; fx = x^3-2*x-5; if sign ( fx ) == sign ( fa ) a = x; fa = fx; Else b = x; fb = fx; End End x x = 2. 0946 Оператор break позволяет досрочно выходить из циклов for или while. Во вложенных циклах break осуществляет выход только из самого внутреннего цикла. В качестве примера рассмотрим цикл while, который используется для чтения m-файла fft.m в символьный массив. Оператор break используется для выхода из цикла, как только будет встречена первая нулевая строка. В результате символьный массив будет содержать описание fft программы.
fid = fopen( ' fft.m ', ' r ' ); s = ''; while ~feof(fid) line = fgetl(fid); if isempty(line), break, end s = strvcat(s, line); End
Диалоговый ввод. Диалоговый ввод можно организовать с помощью команды input, имеющей формат:
user_entry = input( ' prompt ', ' s ' )
При выполнении этой команды на экран выводится запрос prompt в виде строки, затем происходит остановка работы и ожидание ввода с клавиатуры. Необязательный параметр s указывает, что введенный текст является строкой, а не числом. Примеры:
i = input( ' Введите значение. i= ' ); i = input( ' Do you want more? Y/N [Y]: ', ' s ' );
Пауза. Для организации паузы в ходе выполнения программы служит команда pause. Выполнение программы будет продолжаться после нажатия любой клавиши. Для организации паузы в n секунд, следует использовать команду pause(n).
|
Последнее изменение этой страницы: 2017-03-17; Просмотров: 493; Нарушение авторского права страницы