Программирование в среде MATLAB

В этом параграфе мы рассмотрим дополнительные вопросы относительно М-функций, основные операторы программирования М-языка, управление памятью и обработку ошибок.

М-функции

Файлы, которые содержат коды языка MATLAB, называются М-файлами. Для создания М-файла используется текстовый редактор (редактор/отладчик MATLAB). Существует два типа М-файлов: М-сценарии (m-файлы скрипты) и М-функции.

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

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

  • • строка определения функции. Она задает имя функции и количество входных и выходных аргументов, их локальные имена. Например function у = function_name(u,v,w )
  • • первая строка комментария определяет назначение функции. Она выводится на экран с помощью команд lookfor или help < имя функции >;
  • • основной комментарий. Он выводится на экран вместе с первой строкой при использовании команды help < имя функции >. Основной комментарий начинается со второй строки комментария и заканчивается либо пустой строкой, либо началом программного кода;
  • • тело функции - это программный код, который реализует вычисления и присваивает значения выходным аргументам.

Если выходных параметров больше, то они указываются в квадратных скобках после слова function, например, function [х, у, z] = sphere (theta, phi, rho)

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

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

Пример 1. Следующая функция находит среднее значение и медиану для элементов вектора и, используя встроенную функцию n = length (и) и подфункции avg = mean (u, п) и med = median (u, n).

function [avg,med] = newstats(u) % Основная функция n = length(u);

avg = mean(u,n);

med = median(u,n);

function a = mean(v,n) % Подфункция

% Вычисление среднего a = sum(v)/n;

function m = median(v,n)

% Подфункция

% Вычисление медианы w = sort (v);

if rem(n,2) == 1

m = w ( (n +1) / 2) ;

else

m = (w(n/2)+w(n/2+l))/2;

end

Когда функция вызывается из М-файла, то MATLAB сначала проверяет, является ли вызванная функция подфункцией М-файла. Затем ищет частную (private) функцию с тем же именем и, наконец, ищет обычный М-файл на пути поиска файлов. Поэтому нет необходимости заботиться о том, чтобы имя подфункции не совпало с именем существующей функции MATLAB.

Частные функции. Частный каталог представляет собой подкаталог с именем private родительского каталога. М-файлы частного каталога доступны только М-файлам родительского каталога. Поскольку файлы частного каталога не видимы вне родительского каталога, они могут иметь имена совпадающие, с именами файлов других каталогов системы MATLAB. Это удобно в тех случаях, когда пользователь создает собственные версии некоторой функции, сохраняя оригинал в другом каталоге. Поскольку MATLAB просматривает частный каталог раньше каталогов стандартных функций системы MATLAB он в первую очередь использует функцию из частного каталога.

Вызов функции. М-функцию можно вызвать из командной строки системы MATLAB или из других М-файлов, обязательно указав все необходимые атрибуты - входные аргументы в круглых скобках, выходные аргументы в квадратных скобках. Когда появляется новое имя функции, или переменной, система MATLAB проверяет:

  • • является ли новое имя именем переменной;
  • • является ли это имя именем подфункции данного М-файла;
  • • является ли оно именем частной функции, размещаемой в каталоге private;
  • • является ли оно именем функции в пути доступа системы MATLAB.

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

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

  • • clear <имя_функции> - удаление указанной функции из рабочей области;
  • • clear functions - удаление всех откомпилированных программ;
  • • clear all - удаление программ и данных.

Откомпилированные М-функции или М-сценарии можно сохранить для последующих сеансов, используя команду pcode в форме: pcode myfunc

Эта команда выполняет синтаксический анализ М-файла myfunc.m и сохраняет результирующий псевдокод (p-код) в файле с именем myfunc.p. Это позволяет избежать повторного разбора во время нового сеанса работы. При удалении М-файла myfunc.m система работает с P-кодом myfunc.p. Однако справка об этой функции уже недоступна. Применение P-кода целесообразно в двух случаях:

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

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

Проверка количества аргументов. Функции nargin и nargout позволяют определить количество входных и выходных аргументов вызываемой функции. Эту информацию в дальнейшем можно использовать в условных операторах для изменения хода вычислений. Например, function с = testargl(а,Ь) if (nargin == 1) с = а . л 2; elseif (nargin == 2) с = а + b; end

При задании единственного входного аргумента функция вычисляет квадрат входной переменной; при задании двух аргументов выполняется операция сложения.

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

Произвольное количество аргументов. В MATLAB имеются функции, которые могут иметь меняющееся число входных аргументов и меняющееся число выходных параметров. Например, функция S=svd (А) вычисления сингулярных чисел матрицы А. Она может применяться в виде [U, S, V] =svd (А), когда требуется большее число выходных параметров. Другим примером такой функции может служить функция cat (А, В) горизонтального объединения массивов А и в. Она может иметь произвольное число входных массивов, cat (Al,А2,АЗ,А4).

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

(variable argument input, variable argument output). Переменная varargin должна быть последней в списке входных аргументов, после всех обязательных. Переменная varargout должна быть последней в списке выходных переменных. Функции varargin и varargout позволяют передавать произвольное количество входных и выходных аргументов. Тогда система MATLAB упаковывает входные и выходные аргументы в массивы ячеек varargin и varargout. Каждая ячейка может содержать любой тип и любое количество данных.

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

Пример 2. Функция testvar допускает в качестве входных аргументов любое количество векторов из двух элементов и выводит на экран линии, их соединяющие, function testvar(varargin) for k = 1:length(varargin)

x(k) = varargin{k}(1); % Выбор координат k-го вектора

y(k) = varargin{k}(2) ; % из k-ой ячейки

end xmin = min(0,min(x)); ymin = min(0,min(y)); axis([xmin fix(max(x))+3 ymin fix(max(y))+3]) plot(x,y)

Таким образом, функция testvar может работать с входными списками разной длины, например, testvar([2 3],[1 5], [4 8], [б 5], [4 2], [2 3]) testvar([-l 0], [3 -5],[4 2],[1 1])

Формирование входного массива varargin. Поскольку список varargin хранит входные аргументы в массиве ячеек, то необходимо использовать индексы ячеек для извлечения данных. Индекс ячейки состоит из двух компонентов, например, y(i)= varargin{і}(2);

Здесь индекс в фигурных скобках {і} указывает доступ к содержанию і-ой ячейки массива varargin, а индекс в круглых скобках (2) указывает на второй элемент массива в ячейке.

Формирование выходного массива varargout. При произвольном количестве выходных аргументов их необходимо упаковать в массив ячеек varargout. Чтобы определить количество выходных аргументов функции, надо использовать функцию nargout.

Пример 3. Следующая функция использует в качестве входа массив из двух столбцов, где первый столбец - множество значений координаты х, а второй -множество значений координаты у. Функция разбивает массив на отдельные векторы-строки, которые могут быть переданы в функцию testvar в качестве входов, function [varargout] = testvar2(arrayin) for k = l:nargout varargout(k) = arrayin(k,:) % Запись значений в массив ячеек end

Отметим, что оператор присваивания в цикле for использует синтаксис массивов ячеек. А именно, фигурные скобки указывают, что данные в виде строки массива присваиваются ячейке. Вызвать функцию tcstvar2 можно следующим образом: а = {1 2;3 4;5 6;7 8;9 0);

[pl,р2,рЗ,р4,р5] = testvar2(а);

При использовании массивов ячеек в списках аргументов, массивы ячеек varargin и varargout должны быть последними в соответствующих списках аргументов. Например, приведенные ниже обращения к функциям показывают правильное использование списков varargin и varargout: function[out1, out2] = examplel(a,b,varargin) function[і,j,varargout] = example2(xl,yl,x2,y2,flag)

Локальные и глобальные переменные. Использование переменных в М-фай-ле ничем не отличается от использования переменных в командной строке, а именно:

  • • переменные не требуют объявления; прежде чем переменной присвоить значение;
  • • любая операция присваивания создает переменную, или изменяет значение существующей переменной;
  • • имена переменных начинаются с буквы, за которой следует любое количество букв, цифр и подчеркиваний; система MATLAB не поддерживает кириллицу и различает символы верхнего и нижнего регистров;
  • • имя переменной нс должно превышать 31 символа. Болес точно, имя может быть и длиннее, но система MATLAB принимает во внимание только первые 31 символ.

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

Пример 4. Допустим, требуется исследовать влияние коэффициентов ос и Р для модели хищник-жертва, описываемой уравнениями Лотке-Вольтерра:

У = ух-Щ){у2,

У 2 = -У2+&бУ2.-

Создадим М-файл lotka.m, который является векторной функцией правой части данной системы уравнений.

function ур = lotka(t, у)

%LOTKA уравнения Лотке-Вольтерра для модели хищник-жертва global ALPHA BETA

ур = [у(1) - ALPHA*y(l)*у(2); -y(2) + BETA*y(1)*y(2)];

Затем через командную строку введем переменные, которые должны быть приняты функцией lotka.m {глобальные переменные), решим систему и построим графики решений в одном окне.

global ALPHA BETA

ALPHA = 0.01;

BETA = 0.02;

[t,y] = ode23('lotka', [0 10], [1; 1]);

plot(t,y)

Команда global объявляет переменные ALPHA и BETA глобальными и следовательно, доступными в функции lotka.m. Таким образом, они могут быть изменены из командной строки, а новые решения будут получены без редактирования М-файла lotka.m. Для работы с глобальными переменными необходимо:

  • • объявить переменную как глобальную в каждой М-функции, которой необходима эта переменная. Для того чтобы переменная рабочей области была глобальной, необходимо объявить ее как глобальную из командной строки;
  • • в каждой функции использовать команду global перед первым появлением переменной; рекомендуется указывать команду global в начале М-файла.
 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ   След >