MATLAB.Exponenta
–Û·Ë͇ Matlab&Toolboxes

MATLAB

В.Г.Потемкин "Введение в Matlab" (v 5.3)
Глава  4. Отладка и профилирование M-файлов

  В оглавление книги \ К следующему разделу \ К предыдущему разделу \ Предметный указатель

4.2. Режим командной строки

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

Описание команды Синтаксис команды
Установить контрольную точку dbstop [in]  <имя_М-файла>[at] <номер_строки>
Удалить контрольную точку dbclear [in] <имя_М-файла> [at] <номер_строки>
Остановить выполнение при возникновении предупреждения или ошибки, либо при появлении результата NaN или Inf dstop [if] warning
dstop [if] error
dstop [if] naninf
dstop [if] infnan
[ ] - необязательные служебные слова
Продолжить выполнение dbcont
Стек вызываемых функций dbstack
Список контрольных точек данной М-функции dbstatus <имя_М-файла>
Выполнить одну или несколько строк dbstep <количество_строк>
Листинг М-функции с пронуме­рованными строками dbtype <имя_М-файла>
Переход между рабочими облас­тями сверху вниз dbdown
Переход между рабочими облас­тями снизу вверх dbup
Завершить отладку dbquit

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

function y = variance(x)
mu = sum(x)/length(x);
tot= sqsum(x, mu);
y = tot/(length(x)-1);
function tot = sqsum(x, mu)
tot = 0;
for i = 1:length(mu)
        tot = tot + ((x(i)-mu).^2);
end

Установка контрольных точек. Команда dbstop позволяет установить контрольную точку в определенной строке программы.

Для того чтобы установить контрольные точки в модуле variance после вычисления среднего значения (строка 2) и квадрата суммы центрированных значений (строка 3) следует воспользоваться следующими командами

                  dbstop variance 3
                  dbstop variance 4

Отладка кода в режиме работы с клавиатурой. Возьмем в качестве входных данных вектор v = [1 2 3 4 5]. Ожидаемые величины для среднего значения и суммы квадратов центрированных значений соответственно 3 и 10. Эти значения и должны быть получены в контрольных точках. Обратимся к М-функции из командной строки:
                  variance(v)

При останове в контрольной точке MATLAB автоматически переходит в режим работы с клавиатурой, который помечается приглашением K. В этом режиме можно исполнять любые команды системы MATLAB. Для продолжения выполнения программы следует использовать команду dbcont.

При первой остановке в контрольной точке рекомендуется использовать команду whos, которая позволяет увидеть все переменные рабочей области модуля variance:

       K» whos

Name Size Bytes Class
mu 1x1 8 double array
x 1x5 40 double array

         Grand total is 6 elements using 48 bytes
         Общее количество элементов - 6; использовано байтов - 48

Проверим значение mu:

               K» mu
               mu = 3

Воспользуемся командой dbstep, чтобы выполнить одну строку программы; произойдет останов в строке 4 и теперь можно проверить значение переменной tot, которое соответствует сумме квадрратов центрированных входных значений:

               K >> tot
               tot = 4

Это означает, что неправильные вычисления связаны с модулем sqsum.

Перемещение по рабочим областям. Используя функции dbup и dbdown, можно перемещаться от рабочей области одной функции к другой, а также рабочей области системы MATLAB. Для того чтобы войти в рабочую область системы MATLAB из модуля variance, достаточно применить команду

               K» dbup
               In base workspace.
               K» whos

Name Size Bytes Class
v 1x5 40 double array

      Grand total is 5 elements using 40 bytes
      Общее количество элементов - 5; использовано байтов - 40

Переменная v, а также, возможно, другие переменые, введенные пользователем, могут появиться в этом списке. Чтобы вернуться обратно в рабочую область модуля variance достаточно применить команду dbdown.

Листинг М-файла. В режиме клавиатуры можно использовать команду dbtype sqsum, чтобы вывести на экран листинг М-файла sqsum с пронумерованными строками:

         K» dbtype sqsum
         1   function tot = sqsum(x,mu);
         2   tot = 0;
         3   for i = 1:length(x)
         4       tot = tot + ((x(i)-mu).^2);
         5   end

Установим контрольные точки, чтобы проверить величины вычисляемых значений и переменной цикла:
        K>> dbstop sqsum 4
        K>> dbstop sqsum 5

Просмотр стека вызванных функций и продолжение выполнения. Для выхода из режима клавиатуры предназначена команда dbquit. Для удаления контрольных точек в модуле variance следует использовать команду
         dbclear variance

При этом контрольные точки в модуле sqsum сохраняются.

Снова запустим на выполнение модуль variance, вновь используя в качестве входного вектор v:
           variance(v)
           4        tot = tot + ((x(i)-mu).^2);

Применим команду dbstack, чтобы проверить стек вызванных функций и убедиться, что М-функция variance действительно вызвала М-функцию sqsum:

           K» dbstack
           > In d:\matlab5\sqsum.m at line 4
              In d:\matlab5\variance.m at line 3

Проверим значение переменной цикла i и значение tot.

            K» i
            i =       1
            K» tot
            tot =   0

Выполним строку 4 и в контрольной точке строки 5 снова проверим значения i и tot:

           K» dbstep
            5       end
            K» i
            i =       1
            K» tot
            tot =   4

Значение tot изменилось; выполним строку end и вернемся к заголовку цикла; сделав еще один шаг, применим команду dbstack

            K>> dbstep
            K» dbstack

            >In d:\matlab5\variance.m at line 4

Таким образом модуль sqsum выполнил цикл только один раз и возвратился в модуль variance.

Внимательно присмотревшись к заголовку цикла

            for i = 1:length(mu)

можно придти к выводу, что в нем есть ошибка. Окончание цикла задано длиной переменной mu, a не длиной входного вектора x.

Убедимся, что правильное значение tot, равное 10, приводит к верному результату; присвоим переменной tot значение 10; тогда продолжив выполнение, получим верный результат:

            K» tot=10
            tot = 10
            K>> dbcont
            ans = 2.5000

Таким образом, в заголовке цикла надо заменить переменную mu на переменную x.

Завершение сеанса отладки. Чтобы завершить сеанс отладки, следует применить команду dbquit и таким образом возвратиться в рабочую область системы MATLAB. После этого следует внести исправления в М-функцию sqsum.m, так чтобы переменная цикла изменялась от 1 до length(x), а не от 1 до length(mu), то есть заголовок цикла должен иметь вид:

             for i = 1:length(x)

Повторим запуск модуля variance.m и получим требуемый результат:

           variance(v)
            ans = 2.5000

  В оглавление книги \ К следующему разделу \ К предыдущему разделу \ Предметный указатель

 


Поиск по сайту:

Система Orphus

Яндекс.Метрика