Лекция: 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 ) ];

еще рефераты
Еще работы по информатике