来自'.mat'文件的Matlab'load'图形对象打开绘图窗口

MxN*_*xNx 1 matlab matlab-figure matlab-load

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

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

MATLAB工作区

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

我正在使用MATLAB 2015rb.

Sue*_*ver 5

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

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

不幸的是,因为你的figure手柄嵌套在一个struct没有简单的方法,加载它.可能最简单的方法是在加载文件后立即删除图形对象(因为你已经有了句柄).

data = load('filename.mat', 'state');
delete(data.state.hFigure);
Run Code Online (Sandbox Code Playgroud)

如果你真的不喜欢弹出的图形甚至一秒钟,你可以在加载之前将默认的图形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)
Run Code Online (Sandbox Code Playgroud)

另一个可能的解决方案(不需要您知道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', '')
Run Code Online (Sandbox Code Playgroud)

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

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