6.2.
Файлы-функции
Файлы-функции фактически дают возможность расширять MATLAB, посколь- ку определенные вами новые функции, специфические для решения ваших задач,
имеют тот же статус, что и другие функции MATLAB. Переменные в функциях являются по умолчанию локальными, но в версиях 4.0 и выше разрешено объяв- лять требуемые переменные глобальными (
global). Для начала рассмотрим про- стой пример файла-функции.
function r = randint(m,n)
% RANDINT случайная матрица с целыми элементами.
% randint(m,n) возвращает матрицу mxn с целыми
123
% элементами между 0 и 9.
a = floor(10*rand(m,n));
Более общая версия такой функции может иметь такой вид:
function r = randint(m,n,a,b)
% RANDINT случайная матрица с целыми элементами.
% randint(m,n) возвращает матрицу mxn с целыми
% элементами между 0 и 9.
% rand(m,n,a,b) возвращает матрицу с целыми
% элементами в диапазоне между целыми a и b.
if nargin < 3, a = 0; b = 9; end
r = floor((b-a+1)*rand(m,n)) + a;
Этот текст должен быть записан на диск в виде файла с именем randint.m (в соот- ветствие с именем функции -это обязательное условие для функции).
Первая строка функции -объявление имени функции, входные аргументы, вы- ходные аргументы. Без такой строки весь следующий файл является программой,
или сценарием, а не функцией. Так, например, оператор
z = randint(4,5) приве- дет к передаче чисел 4 и 5 переменным m и n, а выходной результат будет передан переменной z. Поскольку переменные в файле-функции локальные, их имена никак не влияют на имена и значения переменных в текущей рабочей области MATLAB.
Отметим роль функции
nargin (число входных аргументов). Использование этой функции в данном примере позволяет установить значение отсутствующих входных аргументов по умолчанию – таких переменных, как a и b в примере. В об- щем случае наличие такой функции позволяет использовать функции с переменным числом входных аргументов и в зависимости от их числа направлять вычисления по разным логическим веткам функции.
Функция может иметь множественные выходные аргументы. Например
function [mean, stdev] = stat(x)
% STAT Среднее и стандартное отклонение
% Для вектора x, stat(x) возвращает среднее
% значение и стандартное отклонение x.
% Для матрицы x, stat(x) возвращает два
% вектора-строки, содержащие, соответственно,
% среднее и стандартное отклонение каждого
% столбца матрицы x.
[m n] = size(x);
124
if m == 1
m = n;
% обработка в случае ввода вектор-строки
end
mean = sum(x)/m;
stdev = sqrt(sum(x.^2)/m - mean.^2);
Если этот файл записать на диск под именем stat.m, то команда
[xm,xd]=stat(x)
присвоит среднее значение элементов x переменной xm, а стандартное отклоне- ние переменной xd. Несмотря на наличие нескольких выходных аргументов, можно присвоить значение функции одной переменной. Например,
xm = stat(x) (ника- ких скобок вокруг xm не требуется) присвоит xm среднее значение x. Символ %
указывает на то, что вся строка символов после него является комментарием и иг- норируется при исполнении. Тем не менее, несколько первых строк-комментариев,
которые являются кратким описанием данной функции, доступны при вводе опе- ратора, т.е. являются той помощью, которая вызывается с помощью команды
help
stat. Такую документацию всегда следует включать в файл-функцию. Приведен- ная выше функция демонстрирует некоторые возможности MATLAB, которые позволяют написать эффективный код. Отметим, например, оператор
x.ˆ2, кото- рый является возведением в степень каждого элемента вектора x, оператор с функ- цией
sum, которая является векторной функцией (п.
5.2
), функцию
sqrt, которая является скалярной функцией (см.
5.1
), и деление в выражении
sum(x)/m, кото- рое является матрично-скалярной операцией.
Приведенная далее функция, которая вычисляет наибольший общий делитель двух целых чисел с помощью алгоритма Евклида, иллюстрирует использование функции вывода сообщений об ошибках (см. п.
6.3
).
function a = gcd(a,b)
% GCD Наибольший общий делитель.
% gcd(a,b) является наибольшим общим делителем
% целых чисел a и b, оба не равны нулю.
a = round(abs(a)); b = round(abs(b));
if a == 0 & b == 0
error(’gcd не определено, если оба числа равны нулю’)
else
while b = 0
r = rem(a,b);
a = b; b = r;
end
end
125
Некоторые дополнительные продвинутые возможности иллюстрируются в сле- дующей функции. Как было отмечено ранее, некоторые входные аргументы функ- ции, например такие, как tol, могут быть сделаны необязательными с помощью функции nargin (число входных аргументов). Аналогично может быть использо- вана функция nargout (число выходных аргументов). Отметим, что используется тот факт, что результатом оператора отношения является число (1 -если истинно и 0 -если ложь). Так, если в операторах while или if используются отношения, то
nonzero означает “истина”, а 0 означает “ложь”. Использованная в конце функция
feval позволяет в качестве входной переменной использовать строку, содержащую имя другой функции.
function [b, steps] = bisect(fun, x, tol)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% BISECT Нуль функции одной переменной методом
% деления пополам.
% bisect(fun,x) возвращает нуль функции.
% fun - строка, содержащая имя вещественной
% функции одной вещественной переменной;
% обычно эта функция определяется в m-файле.
% x начальное приближение. Возвращается значение
% вблизи точки, в которой fun меняет знак.
% Например, bisect(’sin’,3) равна pi.
% Обратите внимание на кавычки вокруг sin.
% Необязательный третий аргумент определяет
% относительную точность результата. По умолчанию
% эта точность eps.
% Второй выходной аргумент (необязательный)
% содержит протокол процесса;
% строки матрицы имеют вид [c f(c)].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Инициализация
if nargin < 3, tol = eps; end
trace = (nargout == 2);
if x = 0, dx = x/20; else, dx = 1/20; end
a = x - dx; fa = feval(fun,a);
b = x + dx; fb = feval(fun,b);
% Поиск изменения знака.
while (fa > 0) == (fb > 0)
126
dx = 2.0*dx;a = x - dx; fa = feval(fun,a);if (fa > 0) = (fb > 0), break, endb = x + dx; fb = feval(fun,b);endif trace, steps = [a fa; b fb]; end%
% Основной цикл
while abs(b - a) > 2.0*tol*max(abs(b),1.0)c = a + 0.5*(b - a); fc = feval(fun,c);if trace, steps = [steps; [c fc]]; endif (fb > 0) == (fc > 0)b = c; fb = fc;elsea = c; fa = fc;end endНекоторые функции
MATLAB являются встроенными, в то время как другие по- ставляются в виде m-файлов. Текст реально имеющихся m-файлов (системы
MA-TLAB или ваших собственных) можно просмотреть с помощью команды
type<имя_функции>. Попробуйте команды
type eig, type vander, и
type rank.
6.3.Текстовые строки, сообщения об ошибках, вводТекстовые строки вводятся в
MATLAB в виде текста в одинарных кавычках. На- пример, оператор
s = ’This is a test’ присваивает данный текст переменной
s.
Вывод текстовой строки осуществляется с помощью оператора
disp. Например,
оператор
disp(’this message is hereby displayed’) выводит соответствующее сообщение на экран. Сообщения об ошибках лучше выводить с помощью функции
error. Например, если в процессе выполнения m-файла будет выполнен оператор
error(’Sorry, the matrix must be symmetric’), то после вывода сообщения на экран выполнение m-файла будет прекращено. В m-файле может быть запрос на интерактивный ввод данных, организованный с помощью оператора
input. Ко- гда вводится оператор
iter = input(’Введите число иттераций: ’), на
экран выводится запрос на ввод, и выполнение программы приостанавливается до того момента, пока пользователь не введет с клавиатуры требуемые входные данные.
После нажатия клавиши
Enter данные присваиваются переменной
iter, и выполне- ние программы продолжается.
127
7.
Работа с m-файлами
Во время работы в MATLAB часто необходимо создавать или редактировать m- файлы, а после этого возвращаться в командное окно MATLAB для отладки или вычислений. В версии 5.0 или старше (в системе Windows-95) имеется специаль- ный редактор/отладчик (см. п.
7.2
), в котором можно исправлять текст и выпол- нять пошаговую отладку программы. После исправления необходимо сохранить сделанные изменения. Как использовать средства отладки в версии 5.0 и старше будет рассказано далее (п.
7.3
).
M-файлы, с которыми вы работаете, должны быть доступны. Для этого либо текущая директория должна быть директорией с вашими файлами, либо необхо- димо проложить туда путь (в смысле DOS). Это можно сделать либо с помощью команд DOS непосредственно из командного окна (команды
cd), либо с помощью пункта меню File/Set Path, который позволяет сделать необходимые директории доступными.
7.1.
Список путей доступа
Для поиска m-файлов система МАТLАВ использует механизм путей доступа по- скольку m-файлы записываются в каталоги или папки файловой системы. Напри- мер, при поиске файла с именем foo МАТLАВ выполняет следующие действия:
1)
просматривает, не является ли foo именем переменной;
2)
просматривает, не является ли foo встроенной функцией;
3)
ищет в текущем каталоге m-файл с именем foo.m;
4)
ищет m-файл с именем foo.m во всех каталогах списка путей доступа.
Реально применяемые правила поиска являются более сложными из-за ограниче- ний, которые связаны с использованием подфункций
3
, личных (private) функций и объектно-ориентированных механизмов. Однако приведенный выше упрощенный порядок поиска точно отражает механизм поиска m-файлов, с которыми обычно работает пользователь.
7.1.1.
Работа со списком путей доступа
В процессе сеанса работы можно вывести на терминал или внести изменения в спи- сок путей доступа, используя следующие функции:
3
Внутри функций допускается определение других функций, только следует иметь в виду,
что доступ к таким функциям возможен только из функций, внутри которых они определены.
128
• path -выводит на
экран список путей доступа;
• path (s) -заменяет существующий список списком
s;
• addpath /home/lib и
path(path, ’/home/lib’) -добавляют новый ката- лог текущего подкаталога в список путей доступа;
• rmpath /home/lib -удаляет путь
/home/lib из списка.
Список путей доступа, используемый по умолчанию, определен в файле
pathdef.m,
который размещен в каталоге
lосаl; этот файл выполняется при каждом запуске системы
MATLAB.
Кроме работы из командной строки существует средство просмотра путей до- ступа
Path Browser (см. далее), которое поддерживает удобный графический ин- терфейс для просмотра и изменения списка путей.
7.1.2.Текущий каталогСистема
MATLAB использует понятие
текущего каталога при работе с m-и mat-файлами во время сеанса работы.
Начальный текущий каталог определен в файле запуска, который ассоции- рован с ярлыком запуска системы
MATLAB, расположенном на рабочем столе.
Для вывода текущего каталога на экран терминала предназначена команда
cd. Для изменения текущего каталога следует использовать команду
cd<новый путь до-ступа>.
7.1.3.Средство просмотра и редактирования путей доступа Path BrowserКак было указано выше, при работе в системе Windows-95 имеется специальное средство для просмотра и изменения путей доступа
Path Browser (рис.
1
). Пока- занное далее окно открывается либо из меню
File/Set Path командного окна, либо с помощью кнопки на инструментальной панели.
После дополнения списка путей доступа необходимо сохранить новый путь с помощью пункта меню
File/Save Path, в противном случае установленный путь будет известен системе только на время одного сеанса работы
4 4
Работающие в терминальном классе должны иметь в виду, что сохранение пути доступа внастоящей конфигурации системы невозможно, поскольку запись в сетевую директорию localзапрещена.129
Рис. 1. Окно Path Browser
7.2.
Использование редактора/отладчика
Редактор/отладчик предоставляет как средства редактирования текста m-файла,
так и средства пошаговой его отладки. Один из способов вызова редактора -вызов из командной строки MATLAB с помощью команды
edit. Например, команда
edit poof откроет встроенный редактор для редактирования файла poof.m, если в меню File в диалоговом окне Preferences не установлен вами другой редактор.
Можно открыть редактор и другим способом – с помощью меню File/New или кнопки New File на панели инструментов (см. далее). Для открытия существу- ющего m-файла выберите пункт File/Open или щелкните на кнопке Open File.
После вызова редактор/отладчик будет иметь вид, показанный на рис.
2
Редактор, используемый в системе, имеет синтаксическую раскраску, т.е. слово или символ по мере ввода приобретают тот цвет, который соответствует их типу.
Редактор различает такие типы вводимых слов:
• Комментарии
• Ключевые слова
• Незаконченные строки
130
Рис. 2. Общий вид редактора/отладчика
• Законченные строки
• Другой текст
С помощью пункта меню Tools/Fonts можно настроить такие важные парамет- ры, как используемый шрифт. Это особенно важно для работы с русским текстом,
поскольку не все шрифты правильно воспроизводят русский текст. В остальном данный редактор не отличается от обычного многооконного текстового редактора - в нем работают все редактирующие клавиши (Del, Bspace, Home и т.д.). При ре- дактировании файлов вы можете непосредственно перейти к требуемой строке при помощи пункта меню Edit/GoTo Line и указать номер требуемой строки в появив- шемся окне. После редактирования файла и повторного его запуска из командного окна желательно предварительно сохранить новый вариант файла. Но можно за- пускать редактируемый файл на счет не выходя из редактора (т.е. не переходя в командное окно) с помощью пункта меню Tools/Run. При этом предварительное сохранение текста исправлений не требуется.
Одной из важных особенностей данного редактора является то, что после про- ведения вычислений можно в редакторе просмотреть значения переменных, кото- рые они имеют в текущий момент в рабочей области. Для этого достаточно устано- вить курсор мыши на этой переменной, и появится прямоугольник с желтым фоном,
на котором выводится текущее значение переменной. Если переменная представля- ет из себя большую матрицу, то таким образом увидеть целиком ее не удастся. Для
131
просмотра (и возможного исправления при отладке) всех значений матрицы есть специальный пункт меню
View/Workspace Browser. Имеется еще два интересных пункта в меню
View. Это пункт
Evaluate Selection, который позволяет вычислять значение выделенного выражения и помещать результат в командное окно, и пункт
Auto Indent Selection, который выполняет автоматическое форматирование тек- ста программы с отступами в соответствии с правилами
MATLAB. Выбор пункта меню
View/Options позволяет получить доступ к диалоговому окну, в котором можно настроить параметры редактора.
7.3.Отладка m-файловОтладка программного кода -это процесс, в ходе которого могут быть выявлены ошибки двух видов:
• синтаксические, которые связаны с неточностью записи имен m-функций или арифметических выражений.
MATLAB обнаруживает большинство син- таксических ошибок, сопровождая их сообщением об ошибке с указанием но- мера строки соответствующего m-файла;
• ошибки времени выполнения, которые, как правило, имеют алгоритмическую природу и проявляются в том, что приводят к непредвиденным результатам.
Достаточно легко можно исправить синтаксические ошибки, которые сопрово- ждаются сообщениями о причинах их возникновения. Ошибки времени выполне- ния выявить более сложно, потому что локальная рабочая область m-функции ока- зывается потерянной, если ошибка приводит к возврату в рабочую область системы
MATLAB. Чтобы определить причину такой ошибки, можно использовать один из следующих приемов:
• реализовать вывод результатов промежуточных вычислений на дисплей, уда- лив в соответствующих операторах точки с запятой, которые подавляют вы- вод на экран промежуточных результатов;
• добавить в m-файл команды
keyboard, которые останавливают выполнение m-файла и разрешают проверить и изменить переменные рабочей области вы- зываемой m-функции. В
этом режиме появляется специальное приглашениеK». Возврат к выполнению функции реализуется командой
return;
• закомментировать заголовок функции и выполнить m-файл как сценарий. Это позволяет проследить результаты промежуточных вычислений в рабочей об- ласти системы;
132
• использовать отладчик системы
МАТLАВ.
Отладчик полезен для исправления ошибок во время выполнения пограммы именно потому, что он дает возможность отслеживать рабочие области функции и проверять или изменять значения соответствующих переменных. Отладчик позво- ляет устанавливать и удалять контрольные точки, то есть специальным образом по- меченные строки m-файла, в которых выполнение останавливается. Это дает воз- можность изменять содержимое рабочей области, просматривать стек вызова m- функций и выполнять m-файл построчно. Отладчик может функционировать как в режиме командной строки, так и в режиме графического интерфейса пользователя.
Далее мы рассмотрим отладку только в режиме графического интерфейса пользо- вателя, поскольку он наиболее прост и нагляден.
Рассмотрим возможности отладки, котрые нам предоставляет