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

Запрет кражи окон Matlab

Есть ли способ сказать Matlab не украсть фокус окна (из внешнего редактора), такой как Emacs) при графических командах, таких как figure и plot. Это значительно увеличило бы мою производительность, потому что я часто хочу продолжить разработку кода во время обработки данных (повторной).

4b9b3361

Ответ 1

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

function change_current_figure(h)
set(0,'CurrentFigure',h)

Затем все операторы рисунка (h) необходимо изменить на change_curent_figure (h).

Примечание. Это включено в документацию matlab.

Следует отметить, что это работает только в том случае, если фигура уже создана. Если новые цифры будут периодически создаваться, можно создать цифры как самые первые строки кода, сохранить дескрипторы, обработать, а затем зарисовать их. Этот пример будет работать. Обратите внимание: команда drawow очистит буфер событий, убедившись, что все фигуры нанесены на график.

Я видел эту работу с 2007 по 2010 год, не уверен, поддерживают ли ее последние или более ранние версии, хотя у меня нет причин подозревать, что они этого не делают.

fig1=figure;
fig2=figure;
drawnow;
[a b]=do_complex_processing;
change_current_figure(fig1)
plot(a);
change_current_figure(fig2)
plot(b);

Ответ 2

У меня есть тот же вопрос, с дополнительной сложностью, что код, создающий цифры, пришел от внешнего поставщика, и я не хотел его изменять. Вот две возможности (идентифицированные с помощью поддержки MathWorks), протестированные на Matlab 2014b:

1. Создайте фигуры, не показывая их, затем покажите их после завершения кода

set(0, 'DefaultFigureVisible', 'off');

for i = 1:10
    fprintf('i: %g\n', i)
    figure;
    pause(1);
end

set(0, 'DefaultFigureVisible', 'on');
figHandles = findall(0, 'Type', 'figure');
set(figHandles(:), 'visible', 'on')

Этот код делает именно то, что нужно, но добавленное неудобство состоит в том, что вы не можете видеть прогресс в выполнении кода, тем самым неспособный прерывать длительный запуск, если что-то пойдет не так.

2. Подсоедините цифры

  • Создайте новый рисунок:

    figure
    
  • Док-станция:

    введите описание изображения здесь

    Это поместит фигуру в окно Matlab IDE.

  • Сделайте новые фигуры состыкованными и запустите код:

    set(0, 'DefaultFigureWindowStyle', 'docked');
    
    for i = 1:10
        fprintf('i: %g\n', i)
        figure;
        pause(1);
    end
    
    set(0, 'DefaultFigureWindowStyle', 'normal');
    

Ответ 3

В R2018a было введено свойство рисунка "WindowState", см. Https://blogs.mathworks.com/pick/2018/07/13/maximize-your-figures/

Используя это, вы можете сделать

set(0, 'DefaultFigureWindowState', 'minimized');

перед запуском фактического сценария, и это приведет к тому, что все "стандартные графики" не украдут фокус и будут открыты в свернутом состоянии.

Есть функции, которые все еще крадут фокус. Я не исследовал подробно, но я считаю, что это в основном автоматические функции построения графиков, такие как psd, hist и т.д. Без выходных аргументов. Если вы называете plot сами, все будет в порядке.