Головна

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)];



По перше, | Disp (message);

Grid on | Plot3 (X, Y, Z) | Grid on | Colormap (copper) | Shading interp | Meshz (X, Y, Z) | Image (X); | Image (X1); colormap (map1); | Image (X1); colormap (map1); | Програмування М-функцій. |

© um.co.ua - учбові матеріали та реферати