Подтвердить что ты не робот

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

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

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

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

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

Спасибо.

4b9b3361

Ответ 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