Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 03-04.doc
Скачиваний:
2
Добавлен:
19.09.2019
Размер:
123.39 Кб
Скачать

3.2 Файл-функции

В файл-функциях описываются функции, определяемые пользователем. Они отличаются от сценариев тем, что могут иметь входные и выходные аргументы, а все переменные, определенные внутри файл-функции, являются локальными и не видны в рабочей среде. Они доступны только в теле данной функции. После выполнения данной файл-функции все значения этих переменных исчезают, а область оперативной памяти, в которой они хранились, освобождается. M-файл, содержащий файл-функцию, должен начинаться с заголовка, после которого следует тело функции, где записываются инструкции на языке системы, с помощью которых в итоге вычисляютя возвращаемые значения. Заголовок состоит из слова function, возвращаемых (выходных) значений, имени файл-функции и списка входных аргументов. Входные аргументы в списке разделяются запятой. Простейший пример файл-функции с тремя входными и одним выходным аргументами – нахождение длины радиус–вектора точки (x;y;z). трехмерного пространства.

function d=mysum(x,y,z)

d=sqrt(x^2+y^2+z^2);

Наберем этот пример в редакторе M-файлов, который вызывается по команде File => New => M-file, и сохраним его. Заметим, что MATLAB предлагает в качестве имени M-файла название файл-функции, т.е. mysum.m. Указанное в заголовке имя функции должно совпадать с именем файла (без учета расширения .m), в который записывается текст функции. Рассогласование имени функции и имени файла не допускается. Убедимся, что каталог с файлом mysum.m является текущим и вызовем файл-функцию mysum из командной строки:

>> s=mysum(2,3,4)

s =

5.3852

При вызове файл-функции mysum произошли следующие события:

● входной аргумент x получил значение 2;

● входной аргумент y стал равен 3;

● входной аргумент z стал равен 4;

● величина записалась в выходной аргумент d;

● значение выходного аргумента d получила переменная s рабочей среды и результат вывелся в командное окно.

Заметим, что оператор 2 в файл-функции mysum завершен точкой с запятой для подавления вывода локальной переменной d в командное окно. Для просмотра значений локальных переменных при отладке М-функций, очевидно, не следует подавлять вывод на экран значений требуемых переменных.

При необходимости, отдельные части М-файла можно дополнять комментариями, которые начинаются со знака процента (%) и не являются исполняемыми инструкциями, а служат лишь для целей документирования процесса программирования. Цель их размещения в тексте программы – пояснить смысл той или иной части программного кода. Например, файл-функцию mysum можно снабдить таким комментарием:

function d=mysum(x,y,z)

%Вычисление длины d=sqrt(x^2+y^2+z^2) радиус-вектора точки (x;y;z)

d=sqrt(x^2+y^2+z^2);

Комментарии, располагающиеся сразу за заголовком определения файл-функции, воспринимаются системой MATLAB как краткая справка об используемой функции. Эта справка появится в командном окне, если ввести команду

>> help имя функции

Аргументами mysum могут быть не только числа или скалярные переменные, но и массивы требуемых размеров. Так, если изменить синтаксис оператора 2 файл-функции mysum – поставить точки перед операциями возведения в степень и сохранить в mysum1.m текст

function d=mysum1(x,y,z)

d=sqrt(x.^2+y.^2+z.^2);

то входные аргументы x,y,z теперь могут быть массивами. При вызове

>> x=[1 2 3];y=[-1 0 2];z=[3 2 1];

>> s=mysum1(x,y,z)

s =

3.3166 2.8284 3.7417

компоненты переменной s рабочей среды (массива размера 1×3) получили значения длин радиус–векторов точек (1;-1;3), (2;0;2) и (3;2;1) соответственно.

Запуск mysum1(2,3,4) и mysum(2,3,4) со скалярными входными аргументами дает одинаковый результат 5.3852., а при запуске mysum(x,y,z) с входными аргументами–массивами x,y,z из предыдущего примера появится сообщение об ошибке – неправильном возведении массива в степень в операторе 2. Поэтому в создаваемых М-файлах желательно предусмотреть процедуру векторизации кода – вместо операторов <^>, <*>, </> следует применять операторы <.^>, <.*>, <./>.

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

Пример файл-функции mysum2 с тремя входными и двумя выходными аргументами, выдающей длину d и квадрат длины d2 радиус–вектора точки трехмерного пространства (x;y;z):

function [d,d2]=mysum2(x,y,z)

d2=x.^2+y.^2+z.^2;

d=sqrt(d2);

При запуске файл-функции mysum2 используем квадратные скобки для указания переменных m и n, в которые будут занесены значения d и d2:

>> [m,n]=mysum2(2,3,4)

m =

5.3852

n =

29

Практически все функции MATLAB являются файл-функциями и хранятся в одноименных M-файлах. Функция cos допускает два варианта вызова: cos(x) и y=cos(x), в первом случае результат записывается в ans, а во втором – в переменную y. Наша функция mysum2 ведет себя точно так же.

Файл-функцию mysum2 можно вызвать без выходных аргументов, или только с одним выходным аргументом. В этом случае вернется только первый аргумент – длина d.

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

function noout(a,b), function [v,u]=noin, function noarg().

Для того, чтобы рабочая область MATLAB и файл-функция могли совместно использовать некоторую переменную с заданным именем, ее всюду нужно объявить как глобальную с помощью ключевого слова global.

Пример файл-функции mysum3 без входных аргументов:

function [d,d2]=mysum3

global x y z

d2=x.^2+y.^2+z.^2;

d=sqrt(d2);

Вызов ее осуществляется следующим образом:

>> global x y z

>> x=2;y=3;z=4;

>> [m,n]=mysum3

m =

5.3852

n =

29

С помощью ключевого слова global перечисленные в командном окне переменные рабочего пространства x=2, y=3, z=4 сохраняют свое значение и имя внутри файл-функции mysum3.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]