2011-01-25 2 views
16

Я пишу длинный сценарий в Matlab, например.Как остановить запущенный скрипт в Matlab

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

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

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

Спасибо.

ответ

8

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

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

4

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

-3

Чтобы добавить на:

вы можете вставить проверку времени в течение цикла с интенсивным или возможным тупиком, то есть.

: 
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 
2

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

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

dos('matlab -automation -r &') 

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

1

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

Кажется, что это то, что мне нужно. Однако эта функция называется mexCancel, как бы это выглядело? – patrik

+0

@patrik Это полностью зависит от того, как выглядит ваш долгий процесс. По сути, отменить, isdone и longprocess все должны быть записаны в c для совместной работы, экспортированы в DLL, а затем mex-функции, написанные для вызова этих функций. Это непросто или чисто, и не будет общего кода. – KitsuneYMG

+0

Спасибо за ответ. Это похоже на обескураживающее, но в любом случае, если это будет достигнуто, это, безусловно, красивое решение. – patrik

0

, если вы используете свой MATLAB на Linux, вы можете прекратить MATLAB командой в Linux консул. первых, вы должны найти номер PID в MATLAB с помощью этого кода:

верхней

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

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

5

Если Ctrl + c не отвечает сразу, потому что ваш скрипт слишком длинный/сложный, удерживайте его.

Команда break не запускается, когда Matlab выполняет некоторые из своих более глубоких скриптов, и либо он не будет регистрировать последовательность ctrl в буфере, либо очищает буфер непосредственно перед или сразу после того, как он завершит эти фрагменты код. В любом случае, когда matlab вернется, чтобы выполнить больше вашего скрипта, он распознает, что вы держите ctrl + c и завершаете.

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

Для очень длительных программ, я нашел, что это будет исключительно полезным http://www.mathworks.com/matlabcentral/fileexchange/16649-send-text-message-to-cell-phone/content/send_text_message.m

но похоже, что у них есть несколько новых функций для этого.

1

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

Alt + F4

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

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

Ctrl + C

также должен работать, но не должен покидать редактор.

Смежные вопросы