Matlab' load'来自' .mat'文件打开绘图窗口

时间:2016-05-22 08:02:12

标签: matlab matlab-figure matlab-load

为什么在我加载包含.mat内的数字的struct文件时,MATLAB会打开一个绘图窗口?

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

MATLAB Workspace

有没有办法阻止MATLAB打开这个绘图窗口?

我正在使用MATLAB 2015rb。

1 个答案:

答案 0 :(得分:5)

显示图形的原因是因为如果仔细查看state结构,就会存储figure个对象。当您从文件加载此图形对象(或任何对象)时,MATLAB将重建该对象。加载图形(它的loadobj方法)的已定义行为是打开图形。

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

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

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

如果你真的不喜欢这个数字即使只是一秒钟弹出,你可以在加载之前将默认数字Visible属性设置为'off',然后重置它。 / p>

% 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实际上会在将一个文件保存到文件时发出警告,因为不建议这样做。

  

警告:图保存在test.mat中。保存图形句柄变量可能会导致创建非常大的文件。保存图形   数字,请使用savefig