8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 78 79 80 81 82 83 84 ... 365

командном строки. Каждое обращение к подфункции f в основной функции приводит к перекоду к размещенным в подфункции операторам и последующему возврату в основную функцию.

Файл-функция может содержать одну или несколько подфункций со своими входными и выходными параметрами, но основная функция может быть только одна. Заголовок новой подфункции одновременно является признаком конца предыдущей. Основная функция обменивается информацией с подфункциями только при помощи входных и выходных параметров. Переменные, определенные в подфункциях и в основной функции, являются локальными, они доступны в пределах своей функции. Листинг 5.10 содержит пример файл-функции с подфункцией, приводящий к ошибке!

I Листинг 5.10. Недопустимое использование локальных параметров

function simplel;

ALP = 5.3;

BET = 9.1;

fl = fd.l, 2.1)

function z = f(x, y)

z = x"3 - 2*ул3 + 3*(хл2 + ул2) - x*y + 9 + ALP*BET;

Попытка выполнить функцию simplel приведет к выводу сообщений о том, что переменная ALP (она первой встретилась при интерпретации оператора) не определена:

» simplel

??? Undefined function or variable ALP. Error in ==> simplel > f at 6

z = хл3 - 2*y"3 + 3*(хл2 + ул2) - x*y + 9 + ALP*BET; Error in ==> simplel at 4 fl = fll.l, 2.1)

Одни из возможных вариантов использования переменных, которые являются общими для все\ функций М-файла, состоит в объявлении данных переменных в начале основной функции и подфункции как глобальных, при помощи global со списком имен переменных, разделяемых пробелом (листинг 5.11).

j Листинг 5.11. Объявление глобальных переменных

function simple2; global ALP BET ALP = 5.3;


BET = 9.1; fl = f(l.l. 2.1) function z = f(x, y) global ALP BET

z = хл3 - 2*ул3 + 3*(хл2 + yA2) - х*у + 9 + ALP*BET;

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

Отметим особенности работы с подфункциями, которые часто приводят к ошибкам. Источником ошибок часто является неверное указание подфункции в качестве входного аргумента таких функций MATLAB, как fpiot, fzero, fminsearch, Quad и других, вызываемых внутри основной функции. Обязательно использование ссылки на подфункцию, а не ее имени, иначе MATLAB игнорирует подфункцию и начинает искать файл-функцию в текущем каталоге и в путях поиска. Листинг 5.12 содержит простой пример основной функции mainfun с подфункцией subfun, демонстрирующий недопустимость задания имени подфункции в первом входном аргументе fplot.

...... . . ...

Листинг 5.12. Правильный и неправильный вызов fplot в основной функции

function mainfun

% основная функция

figure % создание графического окна

subplot(2, 1, 1) % создание верхней пары осей

fplot(@subfun, [1 5]) % правильный вызов fplot с указателем на подфункцию subplot(2, 1, 2) % создание нижней пары осей

fplot(1subfun, [1 5]) % неправильный вызов fplot с именем подфункции

function у = subfun(х) % подфункция у = sin[pi*x);

В результате вызова » mainfun

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


ся верным. Если в текущей папке и путях поиска нет файл-функции subf un, то нижний график содержит прямую линию. Так всегда работает fplot, когда MATLAB не может найти М-файл с файл-функцией для построения графика. Заметьте, что при наличии в текущей папке файл-функции subfun в М-файле fplot будет пытаться построить ее график.

Подфункция доступна только внутри основной функции. Если вы решите вызвать подфункцию f не из файл-функции simple (см. листинг 5.11), а из другой файл-функции, файл-программы или просто из командной строки, то получите сообщение об ошибке:

» fd, 1)

??? Undefined command/function £.

Разумеется, если в текущем каталоге (или путях поиска MATLAB) находится файл-функция f, хранящаяся в файле f.m, или в рабочей среде объявлена переменная f, то ошибки может и не быть, или она будет другого характера. Если доступны различные одноименные функции (приватные, подфункции, встроенные, пользовательские из текущего каталога, функции из Toolbox), то приоритет связывания имени и объекта следующий.

1.Ищется имя в текущей рабочей среде: могут быть определены либо переменная с таким именем, либо вложенная функция (см. далее в этой главе), либо анонимная функция или inline-функция, которые рассматриваются в следующей главе.

2.Ищется подфункция в текущем М-файле.

3.Ищется приватная функция (см. следующий раздел J.

4.Ищется встроенная функция (built-in function).

5.Далее производится поиск требуемой файл-функции в текущем каталоге и путях поиска MATLAB.

Таким образом, пользовательские функции имеют приоритет за исключением случая файл-функции из текущего каталога по отношению к встроенной. Как узнать, является ли функция MATLAB встроенной или нет? Для этой цели служит специальная функция exist, о которой шла речь в главе 1. Возвращаемые значения в случае, если аргумент функция, таковы: 1 — имя занято под переменную рабочей среды, 2 — функция расположена в путях поиска файлов, 5 — встроенная функция (built-in function). Приватные функции и подфункции не идентифицируются. Сравните, например max и bar:

» exist max ans =



0 ... 78 79 80 81 82 83 84 ... 365