Как остановить работу script в Matlab

182
19

Я пишу длинный script в Matlab, например


tic;
d = rand(5000);
[a,b,c] = svd(d);
toc;

Кажется, бежит вечно. Becasue Я нажимаю F5 в окне редактора. Поэтому я не могу нажать C-Break, чтобы остановиться в консоли Matlab.


Я просто хочу знать, как остановить script. Я использую Task Manager, чтобы убить Matlab, что действительно глупо.


Спасибо.

спросил(а) 2021-01-25T20:37:09+03:00 5 месяцев назад
1
Решение
133

Помощник Matlab говорит,
Для M файлов, которые работают долгое время, или для встроенных встроенных модулей или MEX файлов, которые работают долгое время, Ctrl + C не всегда эффективно останавливает выполнение. Как правило, это происходит на платформах Microsoft Windows, а не на платформах UNIX [1]. Если у вас возникла эта проблема, вы можете помочь выполнить разблокировку MATLAB, включив функцию слияния, паузы или getframe в ваш M файл, например, в большом цикле. Обратите внимание, что Ctrl + C может быть менее отзывчивым, если вы запустили MATLAB с параметром -nodesktop.

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

ответил(а) 2021-01-25T20:37:09+03:00 5 месяцев назад
109

Если 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


но похоже, что у них есть и некоторые новые функции.

ответил(а) 2021-01-25T20:37:09+03:00 5 месяцев назад
98

MATLAB не отвечает на Ctrl-C при выполнении функции mex, такой как svd. Также, когда MATLAB выделяет большой кусок памяти, он не отвечает. Хорошая практика заключается в том, чтобы всегда запускать ваши функции для небольшого объема данных, и когда все тестовые прогоны запускают его для фактического масштаба. Когда время является проблемой, вам нужно проанализировать, сколько времени проходит каждый сегмент кода, а также сложная сложность времени.

ответил(а) 2021-01-25T20:37:09+03:00 5 месяцев назад
76

Рассмотрим несколько сеансов Matlab. Храните главное окно сеанса (красивое со всеми цветами, файловый менеджер, история команд, рабочее пространство, редактор и т.д.) Для запуска файлов, которые, как вы знаете, завершатся.


Вещь, с которой вы экспериментируете, скажите, что вы возитесь с пакетом ode, и вы получаете множество предупреждений: матрица единственная, потому что вы изменили какой-то параметр и не предсказали, что произойдет, запустите в отдельном сеансе:


dos('matlab -automation -r &')

Вы можете убить это, не перезагружая весь Matlab.

ответил(а) 2021-01-25T20:37:09+03:00 5 месяцев назад
63

Одно из решений, которое я принял - для использования с 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

ответил(а) 2021-01-25T20:37:09+03:00 5 месяцев назад
63

Поскольку вы упомянули диспетчер задач, я угадаю, что вы используете Windows. Предполагая, что вы запускаете свой script в редакторе, если вы не против выхода из редактора одновременно с выходом из запущенной программы, сочетание клавиш для завершения процесса:


Alt + F4


(Под этим я имею в виду одновременное нажатие клавиш "Alt" и "F4" на клавиатуре.)


В качестве альтернативы, как упоминалось в других ответах,


Ctrl + C


также должен работать, но не выйдет из редактора.

ответил(а) 2021-01-25T20:37:09+03:00 5 месяцев назад
45

если вы используете ваш matlab для linux, вы можете завершить работу matlab командой linux consule.
сначала вы должны найти PID-номер matlab с помощью этого кода:


верхний


то вы можете использовать этот код, чтобы убить Matlab:
убить


Пример:
убить 58056

ответил(а) 2021-01-25T20:37:09+03:00 5 месяцев назад
-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

ответил(а) 2021-01-25T20:37:09+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема