Как остановить работу script в Matlab
Я пишу длинный script в Matlab, например
tic;
d = rand(5000);
[a,b,c] = svd(d);
toc;
Кажется, бежит вечно. Becasue Я нажимаю F5 в окне редактора. Поэтому я не могу нажать C-Break, чтобы остановиться в консоли Matlab.
Я просто хочу знать, как остановить script. Я использую Task Manager, чтобы убить Matlab, что действительно глупо.
Спасибо.
Ответы
Ответ 1
Помощник Matlab говорит,
Для M файлов, которые работают долгое время, или для встроенных встроенных модулей или MEX файлов, которые работают долгое время, Ctrl + C не всегда эффективно останавливает выполнение. Как правило, это происходит на платформах Microsoft Windows, а не на платформах UNIX [1]. Если у вас возникла эта проблема, вы можете помочь выполнить разблокировку MATLAB, включив функцию слияния, паузы или getframe в ваш M файл, например, в большом цикле. Обратите внимание, что Ctrl + C может быть менее отзывчивым, если вы запустили MATLAB с параметром -nodesktop.
Поэтому я не думаю, что существует какой-либо вариант. Это происходит со многими сложными функциями Matlab. Либо мы должны ждать, либо не использовать их!
Ответ 2
Если ctrl + c не отвечает сразу, потому что ваш script слишком длинный/сложный, удерживайте его.
Команда break не запускается, когда matlab выполняет некоторые из своих более глубоких скриптов, и либо он не будет регистрировать последовательность ctrl в буфере, либо очищает буфер непосредственно перед или сразу после того, как он завершит эти фрагменты кода, В любом случае, когда matlab вернется, чтобы выполнить больше вашего script, он распознает, что вы держите ctrl + c и завершаете.
Для более длинных программ я обычно стараюсь найти хорошее место для предоставления обновления статуса, и я всегда сопровождаю это с некоторым промежутком времени, используя tic и toc. В зависимости от того, что я делаю, я мог бы использовать время выполнения, время сегмента, некоторое среднее значение и т.д.
Для действительно длинных программ я нашел это исключительно полезным
http://www.mathworks.com/matlabcentral/fileexchange/16649-send-text-message-to-cell-phone/content/send_text_message.m
но похоже, что у них есть и некоторые новые функции.
Ответ 3
MATLAB не отвечает на Ctrl-C при выполнении функции mex, такой как svd. Также, когда MATLAB выделяет большой кусок памяти, он не отвечает. Хорошая практика заключается в том, чтобы всегда запускать ваши функции для небольшого объема данных, и когда все тестовые прогоны запускают его для фактического масштаба. Когда время является проблемой, вам нужно проанализировать, сколько времени проходит каждый сегмент кода, а также сложная сложность времени.
Ответ 4
Рассмотрим несколько сеансов Matlab. Храните главное окно сеанса (красивое со всеми цветами, файловый менеджер, история команд, рабочее пространство, редактор и т.д.) Для запуска файлов, которые, как вы знаете, завершатся.
Вещь, с которой вы экспериментируете, скажите, что вы возитесь с пакетом ode, и вы получаете множество предупреждений: матрица единственная, потому что вы изменили какой-то параметр и не предсказали, что произойдет, запустите в отдельном сеансе:
dos('matlab -automation -r &')
Вы можете убить это, не перезагружая весь Matlab.
Ответ 5
Одно из решений, которое я принял - для использования с java-кодом, но концепция аналогична с mexFunctions, просто messier - это вернуть FutureValue, а затем цикл while FutureValue.finished() или что-то, что возвращает true. Фактический код выполняется в другом потоке/процессе. Оберните попытку, поймайте это, и для меня будет работать FutureValue.cancel() в блоке catch.
В случае mex-функций вам нужно будет вернуть somesort указателя (как int), который указывает на структуру/объект, который имеет все необходимые вам данные (собственный обработчик потока, bool для полного и т.д.). В случае встроенной mexFunction ваша mexFunction, скорее всего, потребуется назвать эту mexFunction в отдельном потоке. Функции Mex - это всего лишь DLL/общие объекты.
псевдокод
FV = mexLongProcessInAnotherThread();
try
while ~mexIsDone(FV);
java.lang.Thread.sleep(100); %pause has a memory leak
drawnow; %allow stdout/err from mex to display in command window
end
catch
mexCancel(FV);
end
Ответ 6
Поскольку вы упомянули диспетчер задач, я угадаю, что вы используете Windows. Предполагая, что вы запускаете свой script в редакторе, если вы не против выхода из редактора одновременно с выходом из запущенной программы, сочетание клавиш для завершения процесса:
Alt + F4
(Под этим я имею в виду одновременное нажатие клавиш "Alt" и "F4" на клавиатуре.)
В качестве альтернативы, как упоминалось в других ответах,
Ctrl + C
также должен работать, но не выйдет из редактора.
Ответ 7
если вы используете ваш matlab для linux, вы можете завершить работу matlab командой linux consule.
сначала вы должны найти PID-номер matlab с помощью этого кода:
верхний
то вы можете использовать этот код, чтобы убить Matlab:
убить
Пример:
убить 58056
Ответ 8
Добавить:
вы можете вставить проверку времени в цикле с интенсивным или возможным тупиком, т.е.
:
section_toc_conditionalBreakOff;
:
где в этом разделе
if (toc > timeRequiredToBreakOff) % time conditional break off
return;
% other options may be:
% 1. display intermediate values with pause;
% 2. exit; % in some cases, extreme : kill/ quit matlab
end