В Matlab можно ли завершить скрипт, но сохранить все его внутренние переменные в рабочее пространство?

18

Я запускаю скрипт, но он занимает слишком много времени, поэтому я хочу закончить скрипт. Однако он рассчитал много данных, которые я бы в идеале не хотел выбрасывать. Есть ли альтернатива ctrl-C , с которой вы сохраняете внутренние функциональные переменные в рабочей области?

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

Некоторые подобные вопросы я нашел, но это не отвечает на мой вопрос:

закрыть / приостановить

завершить

Разный вопрос, похожий ответ:

dbstop

EDIT:

Этот вопрос отличается от того, что проблема, с которой сталкивается айзер, отличается: они хотят знать, где ошибка, что в моем случае говорит Matlab. Я просто хочу сохранить все данные из рабочей памяти, когда это произойдет.

    
задан Leo 25.09.2013 в 15:12
источник
  • Я не думаю, что вы можете это сделать: forums.codeguru.com/... дает некоторые предложения в отношении будущего. Вы можете подумать о том, чтобы периодически сохранять все свои переменные в fie, а затем, если вы попадете в эту ситуацию, вы сможете просмотреть этот файл после взлома. Не поможет вам сегодня. Но это хороший запрос для отправки в Mathworks! –  Dan 25.09.2013 в 15:24
  • Вы не можете поймать ctrl-c в MATLAB. Для альтернативных решений, возможно, это помогает: mathworks.com/matlabcentral/newsreader/view_thread/246784 –  sebastian 25.09.2013 в 15:29
  • возможный дубликат запуска скрипта в середине –  horchler 03.05.2015 в 20:43
  • @horchler Хотя их решение такое же, их проблема не была. Они в основном хотят знать, откуда возникает ошибка, я хочу сохранить данные в рабочей памяти при возникновении ошибки. –  Leo 04.05.2015 в 12:58

3 ответа

36

версии MATLAB 2016a и более поздние версии

Если вы используете версии Matlab после 2016а, на самом деле появляется кнопка паузы, которая появляется при запуске скрипта (как описано @pedre). Это позволяет приостанавливать сценарий, проверять переменные и затем возобновлять его.

Обязательно проверьте следующий раздел, поскольку это может быть удобно.

Старые версии MATLAB

На самом деле трюк заключается в использовании dbstop if error .

Сначала используйте это, затем запустите свой скрипт. Когда вы вводите ошибку (например, с помощью Ctrl + C ), вы можете вручную просмотреть / сохранить свои рабочие области.

Вы не сможете возобновить выполнение сценария.

    
ответ дан Dennis Jaheruddin 25.09.2013 в 15:36
источник
  • После прочтения многих из них, вы не можете сделать это, это гораздо лучший ответ, чем я ожидал, спасибо! Если я запустил это как первую команду внутри тела функции, будет ли она работать? –  Leo 25.09.2013 в 15:40
  • @Leo Я думаю, что вы можете позвонить ему в любое время до того, как произойдет ошибка, хотя кажется немного странным, что вы добавляете команды отладки в ваши обычные функции. Лично я обнаружил, что моя эффективность значительно повысилась после того, как я положил это в мой старт. (Если есть ошибка, которая разбивает мой код, я хочу посмотреть на него в любом случае в 99% случаев). –  Dennis Jaheruddin 25.09.2013 в 15:55
  • Вы также можете найти эти параметры отладки в графическом интерфейсе. Редактор> Точки останова. Вы также можете разблокировать предупреждения или установить точки останова в определенных местах вашего сценария и даже условные точки останова. Стоит знать, как их использовать. –  Bernhard 07.02.2017 в 15:36
  • Кто-то попробовал отредактировать мой пост, чтобы сообщить мне, что решение «не работает» для 2015b. У меня нет доступа к 2015b сейчас, но был бы очень удивлен, если бы dbstop, если бы ошибка была внезапно выведена из строя. - Если вы чувствуете, что этот ответ очень неполный, подумайте над тем, чтобы добавить ответ, чтобы люди могли получить преимущества и просмотреть его. –  Dennis Jaheruddin 23.02.2017 в 17:02
3

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

    

ответ дан Pedro Luque 20.06.2016 в 20:32
источник
  • Существует много пользователей, использующих старые версии MATLAB (pre R2016a). Я предлагаю вам добавить примечание о том, что оно было введено в релиз R2016a. Посмотрите на этот ответ. –  Stewie Griffin 21.06.2016 в 14:05
  • Добро пожаловать в SO, и спасибо за ответ! =) Небольшое примечание: такие предложения, как «У меня такая же проблема ...» и т. Д., Считаются помехами, поскольку на самом деле он не добавляет никакой информации в ответ. SO немного отличается от многих других форумов и q / a сайтов, поскольку он фокусируется на проблеме и ответе в одиночку, а не на личном аспекте. Причина этого в том, что вопросы и ответы есть для будущих посетителей, а не для человека, задающего конкретный вопрос. В качестве примера, начиная вопросы с: «Привет, у меня есть проблема и пробовал в течение 2 часов ....» - это просто шум для всех, кто читает вопрос. –  Stewie Griffin 21.06.2016 в 14:14
  • Поскольку вы не можете добавлять изображения самостоятельно, я включил снимок экрана кнопки паузы. Если вам не нравятся мои изменения, в разделе редактирования есть опция «Откат». Вы можете отредактировать вопрос, нажав «редактировать» ниже ответа. Во всяком случае, +1 от меня =) –  Stewie Griffin 21.06.2016 в 14:17
2

Коллега показал мне альтернативный способ включить это в мою функцию, присоединив команду save() к аннулированию waitbar , например:

%appoint emergency file location
emergencysave = char(inputdlg({'fill in here:'}, 'windowtitle', 1, 'c:\defaultstringhere.mat'));

%or just emergencysave = 'c:\emergencysave.mat';



%create some GUI element you can cancel
times = 10;
wbinfo = struct('curlength', {0.0});
wb = waitbar(wbinfo.curlength);
wbinfo.wb = wb;



%attach save() to cancelling
anyimportantvariable = [];
for i=1:times
    anyimportantvariable = [anyimportantvariable, i^2];
    wbinfo.curlength = i/times;
    try
        waitbar(wbinfo.curlength, wb)
    catch
        save(emergencysave, 'anyimportantvariable');
        return;
end
    
ответ дан Leo 25.09.2013 в 16:15
источник