Matlab 'load' 来自“.mat”文件的图形对象打开图 window

Matlab 'load' figure objects from '.mat' file opens plot window

为什么当我加载 .mat 文件时 MATLAB 打开一个绘图 window,该文件包含 struct 中的图形?

我面临的问题是我将优化算法的输出作为 .mat 文件的集合。每个 .mat 文件以单个 struct 的形式包含每一代算法的状态。状态结构(在其他变量中)有一个 matlab.ui.Figure 类型的字段。现在,每当我尝试使用 load 命令加载这些文件中的任何一个时,绘图 window 都会自动打开。

有什么方法可以阻止 MATLAB 打开这个图 window?

我正在使用 MATLAB 2015rb。

它显示图形的原因是如果你仔细观察你的 state 结构,那里存储了一个 figure 对象。当您从文件中加载此图形对象(或任何对象,实际上)时,MATLAB 将重建该对象。加载图形的定义行为(它是 loadobj 方法)是打开图形。

这是最近的一个问题,因为旧版本的 MATLAB 将图形句柄简单地存储为数字,当从文件加载图形句柄时,MATLAB 无法知道它应该是一个图形,因此它只会解析它作为一个数字并继续前进而不显示新数字 window。

不幸的是,由于您的 figure 句柄嵌套在 struct 中,因此没有简单的方法 加载它。可能最简单的做法是在加载文件后立即删除图形对象(因为您已经有了句柄)。

data = load('filename.mat', 'state');
delete(data.state.hFigure);

如果你真的不喜欢弹出的数字哪怕一秒钟,你可以在加载之前将默认数字 Visible 属性 设置为 'off' 然后重置之后。

% Determine what the visibility was
prev = get(0, 'DefaultFigureVisible');

% Make it so figures don't appear
set(0, 'DefaultFigureVisible', 'off')

% Load data and delete the figure
data = load('filename.mat', 'state');
delete(state.hFigure);

% Reset the visibility
set(0, 'DefaultFigureVisible', prev)

另一个可能的解决方案(不需要您知道 figure 句柄在您的结构中的位置)是覆盖 DefaultFigureCreateFcn 以简单地删除创建的任何图形。

% After this point you can't create any figures or they will delete themselves
set(0, 'DefaultFigureCreateFcn', @(s,e)delete(s))

% Load your data (no figures!)
load('filename.mat', 'state')

% Allow figures to be created again
set(0, 'DefaultFigureCreateFcn', '')

将来,为避免这种行为,请考虑不在 .mat 文件中保存任何图形句柄。它们是非常大的对象,MATLAB 实际上会在将一个对象保存到文件时发出警告,因为不推荐这样做。

Warning: Figure is saved in test.mat. Saving graphics handle variables can cause the creation of very large files. To save graphics figures, use savefig.