Как прервать выполнение программы в матлабе

Я хочу запустить свою программу в режиме отладки, используя “Step”, “Step In”, “Step Out” и т.д. Но кнопки или значки затенены или отключены. Итак, как я могу войти в режим отладки? Пожалуйста, помогите мне.

Лучший ответ:

Вам нужно выполнить разрывы в какой-то момент, чтобы отладить его. Самый простой способ – добавить команду keyboard в том пункте, который вы хотите отлаживать. Когда линия будет достигнута, выполнение остановится, и вы сможете проверить переменные и выполнить свой код. Вы также можете использовать команду dbstop if error , которая переходит в режим отладки при возникновении ошибки, позволяя вам проверить состояние, вызвавшее ошибку.

В MATLAB отсутствует режим без явного отладки. Причиной этого является просто то, что MATLAB script интерпретируется, а не компилируется, а также тот факт, что когда ваш код заканчивает выполнение, текущие объекты данных сохраняются в вашем workspace , если вы явно не очистите его.

Таким образом, для отладки программы MATLAB вам просто нужно запустить свой код (с помощью breakpoints как это необходимо) и проверить свои элементы данных, когда поток выполнения прерывается или заканчивается.

MatLab. Урок 5. Разработка графического интерфейса программы (GUI)

Есть ли у вас контрольные точки?
В Matlab нет режима отладки, вы должны иметь точку останова в каком-то месте и просто выполнить свой код, выполнение остановится в точке останова.

Установите точку останова в любой строке, где вы хотите начать шаг за шагом script.
Запустите script, и меню расширяется со всеми обычными функциями шага отладки.
Хорошо работает, но не интуитивно, не имеет возможности перейти к первой строке кода.
Если это небольшой script, просто поместите точку останова в первую строку кода, и вы можете пройти все это, если хотите

Стандартные параметры типа отладки для шага, выхода, запуска в курсор и т.д. появляются только (на вкладке “Редактор” ), как только ваш запуск script достиг своей первой точки останова.

Чтобы установить точку останова, щелкните левой кнопкой мыши по левому краю окна редактора для вашего script (только справа от номеров строк (если они есть)).

Нажмите F5 , чтобы запустить ваш script, затем он остановится в первой точке останова, а затем станут доступны другие параметры. Есть подсказки для этих опций, если вы наводите на них курсор – например, F10 , чтобы выполнить следующую строку,…

Читайте также:
В каком пункте строки меню программы word находится команда правописание

Источник: techarks.ru

Как я могу прервать выполнение программы в MATLAB?

Как остановить выполнение программы в MATLAB без выхода из MATLAB. Я ищу что-то вроде exit (1) в С++.

Я попробовал exit/quit, но они также убивают MATLAB, который не является поведением, которое я хочу.

В идеале я бы использовал try-catch для создания ошибок, но я исправляю существующий код и не могу этого сделать из-за глубоко вложенного стека вызовов. Спасибо!

Я также пробовал error и return , но они попадают в блоки catch catch, которые не то, что я хочу. Я просто хочу остановить запущенную программу для выхода.

MATLAB 03 Написание программ

Кроме того, Ctrl-C требует, чтобы пользователь остановил выполнение, и это не то, что я хочу.

3 ответа

3 chappjc [2014-02-21 12:44:00]

Чтобы эффективно использовать terminateExecution , я считаю, что нужно сразу же вызвать короткий pause , чтобы дать Java время для отправки нажатия клавиши и для MATLAB для его обработки. Все вложенные инструкции try — catch будут разбиты, как вам кажется.

killTest.m

function killTest try annoyingFunction(); fprintf(‘Does not run.’); catch ME fprintf(‘Fooled again! (%s)n’,ME.message); end end function annoyingFunction() somethingWrong = true; % more useful code here if somethingWrong, % error(‘annoyingFunction:catchableError’,’catchable error’); terminateExecution % by Pursuit % interrupt % by Matt B. pause(0.1) end end

Пример

Вы возвращаетесь в командную строку непосредственно из подфункции, но похоже, что программа была прервана нажатием клавиши:

>> killTest Operation terminated by user during killTest>annoyingFunction (line 17) In killTest (line 4) annoyingFunction(); >>

Если вы используете error (раскомментируйте строку ошибки внутри annoyingFunction для проверки), она попадает в оператор catch в killTest :

>> killTest Fooled again! (catchable error)

Предлагаемые изменения interrupt (упрощения, более надежное получение дескриптора командного окна и читаемость):

function interrupt import java.awt.event.KeyEvent import java.lang.reflection.* base = com.mathworks.mde.cmdwin.CmdWin.getInstance(); hCmd = base.getComponent(0).getViewport().getView(); cmdwin = handle(hCmd,’CallbackProperties’); argSig = javaArray(‘java.lang.Class’,1); argSig(1) = java.lang.Class.forName(‘java.awt.event.KeyEvent’); msTime = (8.64e7 * (now — datenum(‘1970’, ‘yyyy’))); args = javaArray(‘java.lang.Object’,1); args(1) = KeyEvent(cmdwin,KeyEvent.KEY_PRESSED,msTime. KeyEvent.CTRL_DOWN_MASK,KeyEvent.VK_C,KeyEvent.CHAR_UNDEFINED); method = cmdwin.getClass().getDeclaredMethod(‘processKeyEvent’,argSig); method.setAccessible(true); method.invoke(cmdwin,args);

Примечание. Если вы в порядке с типизацией чего-либо полностью, просто используйте keyboard , и когда он остановится в приглашении отладки ( K>> ), введите dbquit , и вы вернетесь в командную строку базового рабочего пространства. Симпатичный способ создания интерактивного триггера для выполнения dbquit был предоставлен в MATLAB Central newsreader. Моя версия этого решения:

Читайте также:
Как построить диаграмму в программе ms excel

fprintf(‘Terminate execution?nYes / Non’); keyboard

Когда этот бит кода запущен, вы получите небольшое приглашение следующим образом:

Terminate execution? Yes / No

Текст «Да» и «Нет» будет доступен для кликов и будет либо исполнять dbquit , либо dbcont .

Источник: qarchive.ru

Увеличиваем скорость вычислений в Matlab

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

Статья является описанием жизненного опыта и вольным переводом англоязычной публикации.

Не секрет, что крупномасштабные численные расчеты предъявляют к компьютерному железу немалые требования. Сидя за своей диссертацией, я понял что мой домашний компьютер перестал удовлетворять мои потребности в вычислениях. Так как два месяца назад я сменил компьютер и собрал топовое железо, то вариант со сменой аппаратной части для меня не подходил. Существует мнение, что оптимизация кода — дело не сильно важное, проще просто заняться увеличением расходов на приобретение более современного железа, и это мнение имеет право на существование, но я его не разделяю и поэтому полез в свой код и в специальную литературу.

Matlab относится к интерпретируемым языкам, это казалось бы делает его не подходящим языком для крупномасштабных научных вычислений. Все потенциальные возможности языка реализуются благодаря обширному набору библиотек и операции векторизации. Понятие концепции векторизации занимает центральное место в понимании того, как следует писать эффективный код на Matlab. Все данные хранятся в RAM в виде векторов, поэтому и скорость работы численных алгоритмов в Matlab напрямую зависит от использования операции векторизации.

Ниже будут представлены некоторые основные выдержки из официальной документации Matlab, которые помогут Вам в написании эффективных процедур в Matlab. Можно стать одержимым и тратить возмутительно много человеко-часов рабочего времени на оптимизацию кода, которая поможет выиграть лишь несколько секунд время выполнения программы, но повторюсь, сказав что это была моя производственная необходимость.

Производительность ваших программ может значительно вырасти, если вы будете использовать нижепреведенные приемы:

  • Используйте векторные операции, а не циклы;
  • Используйте предварительное выделение памяти для векторов и матриц;
Читайте также:
Какой программой можно разделить видео на части
Использование векторных операция вместо циклов

Рассмотрим следующий пример:
dx = pi/30;
nx = 1 + 2*pi/dx;
for i = 1:nx
x(i) = (i-1)*dx;
y(i) = sin(3*x(i));
end
Совершенно очевидно, что в нем происходит создание векторов x и y. Однако Matlab выделяет память для переменных «на лету». Во время первого прохода цикла создаются два вектора по одной строке длиной 1. На каждом следующем шаге происходит увеличение длины векторов. Во время каждого прогона цикла будет происходить выделение памяти под переменные Matlab’ом, что отнимает процессорное время.
Предпочтительнее использовать следующий метод задания векторов:
x = 0:pi/30:2*pi
y = sin(3*x);
Первая строка кода создает вектор-строку x, под которую выделяется размер памяти соответствующий ее длине и элементы вектора хранятся в смежных ячейках RAM. Вторая строка кода инициирует создание второй вектор-строки, под которую Matlab сразу же выделяет необходимую память, не возвращаясь больше к этому вопросу.
Помните главное: Matlab больше приспособлен к векторным и матричным вычислениям, именно для этого он и разрабатывался.

Предварительное выделение памяти для векторов и матриц

Хотя Matlab автоматически регулирует размеры векторов и матриц, все-таки лучше предварительно выделить матрицы. Предварительное распределение берет на себя расходы на выделение памяти только один раз, и это гарантирует, что матричные элементы будут храниться в смежных ячейках оперативной памяти (по столбцам).
Рассмотрим следующий код:
dx = pi/30;
nx = 1 + 2*pi/dx;
nx2 = nx/2;

for i = 1:nx2
x(i) = (i-1)*dx;
y(i) = sin(3*x(i));
end

for i = nx2+1:nx
x(i) = (i-1)*dx;
y(i) = sin(5*x(i));
end
Это неоптимизированный код, так как мы люди думающие, то мы знаем размер векторов x и y, и можем воспользоваться этим знанием:
dx = pi/30;
nx = 1 + 2*pi/dx;
nx2 = nx/2;

x = zeros(1,nx);
y = zeros(1,nx);

for i = 1:nx2
x(i) = (i-1)*dx;
y(i) = sin(3*x(i));
end

for i = nx2+1:nx
x(i) = (i-1)*dx;
y(i) = sin(5*x(i));
end
Этот код был преобразован, однако имеются еще кусочки, к которым можно применить правило предварительного распределение памяти. Вектора x (i) =. и y (i) =… не используют преимущества векторизации.
Оптимальнее всего будет написать вот так:
dx = pi/30;
nx = 1 + 2*pi/dx;
nx2 = nx/2;
x = zeros(1,nx);
y = x;

for i = 1:nx2
x(i) = (i-1)*dx;
y(i) = sin(3*x(i));
end

for i = nx2+1:nx
x(i) = (i-1)*dx;
y(i) = sin(5*x(i));
end
Надеюсь данная статья будет полезна еще кому-либо, в свое время она сэкономила мне немало времени ожидания и помогла успешно выполнить поставленную задачу.

  • Программирование
  • Matlab

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru