Лекция: Help имя_M-функции
Поскольку такую команду в первую очередь будут применять пользователи функции ( а не разработчики ), то желательно расположить в этих комментариях описательную информацию и сведения о правильном вызове этой функции.
Теперь подробно остановимся на вопросе об отладке M-функций, то есть на приёмах, с помощью которых можно выявить месторасположение ошибок и их причину. Система MATLAB осуществляет серьёзную помощь в этом процессе. В частности, при возникновении ошибки в процессе выполнения M-функции, в командное окно выводится приблизительное диагностическое сообщение ( не следует переоценивать качество такой диагностики ) и номер строки, в котором по мнению MATLABа произошла ошибка.
Другим, более развитым способом отладки функции является применение точек останова и пошаговое выполнения тела функции. Для этого применяют встроенные возможности редактора-отладчика системы MATLAB. То, что уже многократно применяемый нами редактор ( в нём набираем текст функций и с помощью меню сохраняем в файле ) заодно является и отладчиком, говорит даже заголовок его окна:
Matlab Editor / Debugger
так как debugger в переводе с английского означает "отладчик".
Чтобы поставить «точку останова» на какой-либо строке кода функции, туда нужно поместить курсор и нажать клавишу F12 ( повторное нажатие этой клавиши убирает точку останова ). Вместо нажатия этой клавиши можно выполнить команду меню
Debug | Set/Clear Breakpoint
но всё же быстрее это можно выполнить нажатием клавиши. После этого в строке слева появляется красный кружок, указывающий на то, что в данной строке проставлена точка останова. После этого, не закрывая окна Редактора/Отладчика ( Editor/Debugger ), переключаем фокус ввода с клавиатуры в командное окно MATLABа и запускаем обычным образом функцию на выполнение. После этого и произойдёт останов выполнения функции прямо на строке, в которой поставлена точка останова (Breakpoint ).
Теперь мы можем просматривать фактические значения входных параметров функции, текущие значения глобальных и локальных переменных, а также значения выражений. Чтобы просмотреть значение переменной, достаточно подвести курсор к её имени в тексте функции, после чего на экране появится всплывающий жёлтый прямоугольник со значением переменной внутри него:
Далее, нажимая клавишу F10 мы можем выполнять функцию построчно, каждый раз проверяя результаты такой пошаговой работы функции. В результате всегда можно «окружить ошибку» и выявить её причину.
Изменив текст функции и устранив выявленную ошибку, запускаем функцию на выполнение, в результате чего либо удостовериваемся в её правильной работе, либо находим новую ошибку. Желательно продумать методику отладки, запуская функцию на выполнение с разными значениями аргументов и разными значениями глобальных функций. В результате такого итерационнного отладочного процесса приходят к правильно работающим функциям.
#$+Массивы символов.
До сих пор мы мели дело с единственным типом данных — массивами вещественных чисел. Это действительно основной тип данных системы MATLAB, предназначенный для вычислений. В то же время, при рассмотрении графики MATLABа мы столкнулись с типом данных "короткое целое", обозначаемое с помощью ключевого слова uint8. Этот тип данных специально предназначен для компактного хранения больших массивов целых чисел, что очень характерно для графических задач. Однако производить вычисления с типом данных uint8 нельзя ( по крайней мере в версии системы MATLAB 5.2 ). Если всё же нужно произвести вычисления, то сначала тип данных uint8 приводят явно к типу double, производят вычисления и возвращаются к типу uint8 для дальнейшего хранения.
Во всех языках программирования, и MATLAB здесь не исключение, большую роль играет обработка текстовых данных. Для этой цели в системе MATLAB предусмотрен тип данных char ( то есть «символ» ). Текстовые данные, в том числе и одиночный символ, должны заключаться с обеих сторон апострофами:
c1 = 'a'; c2='abcd'; c3 = 'Hello, World!';
В результате таких присваиваний создаются переменные ( естественно, это массивы — в системе MATLAB всё является массивами ) типа char:
Из рисунка видно, что текстовые данные в системе MATLAB являются вектор-строками типа char ( одна строка и несколько столбцов по числу содержащихся символов ). Например, переменная c3 является символьным массивом ( часто говорят — строкой символов ) из 13 символов, занимающим 26 байт. Таким образом, под каждый символ отводится 2 байта. Каждый символ кодируется целым числом в соответствии со стандартной системой кодировки ASCII. Легко практически выяснить, какой код соответствует тому или иному символу. Следующий фрагмент
code = double( c1( 1 ) )
code=
9 7
показывает, что символу 'a' соответствует десятичное число 97.
Если после того, как переменная c3 получила текстовое значение 'Hello, World!', написать
c3 = 3.14;
то переменная c3 станет уже переменной типа double. Так как в сложных и громоздких M-функциях могут возникнуть ситуации, когда заранее неизвестен тип переменной в какой-либо момент времени исполнения функции, то с целью определения типа переменной следует применить функцию isa. Например, следующий вызов этой функции
isa( s3, 'char' )
вернёт истину ( единицу ), если переменная s3 является в этот момент строковой (символьной), и вернёт ложь ( нуль ) в противоположном случае.
По отношению к массивам символов справедливы также все операции, которые мы ранее рассмотрели для случая массивов типа double. Например, вместо группового присваивания c2 = 'abcd' можно организовать поэлементное присваивание с помощью операции индексации:
c2( 1 )='a'; c2( 2 )='b'; c2( 3 )='c'; c2( 4 )='d';
или осуществить операцию конкатенации
c2 = [ 'abc', 'd' ]; c2 = [ c2, ' QWERTY' ];
В тесной связи с рассмотренной операцией конкатенации текстовых строк находится стандартная функция int2str, которая преобразует целые числовые значения в символы, отображающие эти целые числа. Например, вызов функции
res = int2str( 2 )
приведёт к появлению текстовой переменной res со значением '2'. В итоге, мы имеем возможность сформировать в цикле набор нескольких имён функций, отличающихся только последним символов — их номером:
name = 'function'; arg = 10.7;
for k = 1: 10
Name = [ name ,int2str( k ) ];
res( k ) = feval( Name, arg );
End
и даже вычислить значения всех таких функций при значении аргумента arg. Это осуществляется с помощью стандартной функции системы MATLAB feval, которая принимает в качестве своего первого аргумента текстовую строку с именем M-функции, подлежащей вычислению. Второй и последующие аргументы этой функции служат для передачи в качестве аргументов вычисляемым функциям.
В вышеприведённом фрагменте результаты вычислений десяти функций запоминаются в массиве res.
Если требуется в одной переменной запомнить несколько имён функций ( это возможно в случае их одинаковой длины ) для последующего их исполнения с помощью feval, то можно сформировать текстовый массив размерности 2;
Names( 1,: ) = 'function1';
Names( 2,: ) = 'function2';
Первая строка этого массива содержит имя первой функции, вторая строка — второй функции. Размер этого массива типа char есть 2 x 9.
Часто текстовые строки используются для вывода в командное окно системы MATLAB для информирования пользователя о ходе выполнения M-функции. Это осуществляется с помощью функции disp, принимающей в качестве аргумента текстовую строку:
x = 7;
message = [ ' Variable x = ', int2str( x ) ];