Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Передача данных через глобальные переменные.



Поскольку переменные в файлах-функциях являются локальными, то передача данных из модуля в модуль происходит только через входные и выходные параметры. Команда

 

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; Просмотров: 458; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.048 с.)
Главная | Случайная страница | Обратная связь