【问题标题】:Matlab 'load' figure objects from '.mat' file opens plot windowMatlab 从“.mat”文件中“加载”图形对象打开绘图窗口
【发布时间】:2016-09-19 04:59:39
【问题描述】:

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

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

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

我正在使用 MATLAB 2015rb。

【问题讨论】:

  • AFAIK,最近的 MATLAB 版本中添加了这种奇怪的行为。由于.fig files are actually .mat filesload(filename,'-mat') 可能会起作用...如果此解决方案适合您,我可以将其作为答案发布。
  • @Dev-iL 感谢您的回复。我尝试了您的解决方案,但不幸的是它不起作用。无论如何谢谢你。
  • 好的,下一个想法 - 您是否尝试使用 matfile 加载您想要的变量?
  • @Dev-iL 是的,但它再次不起作用。

标签: matlab matlab-figure matlab-load


【解决方案1】:

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

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

不幸的是,由于您的 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 实际上会在将其保存到文件时发出警告,因为不推荐这样做。

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

【讨论】:

  • 效果很好,我的问题解决了。谢谢。
  • 您也可以在加载文件后调用close(gcf)。但是感谢您的扩展答案,我发现禁用图形创建的选项非常有用!
  • @JorgeGT 你可以这样做,但这会对你的文件做出很多假设(即它只包含一个数字),并且还假设gcf实际上以某种方式指向到那个并不总是保证的数字。
  • @Suever 哦,当然!我的意思是OP的例子。这就是为什么我真的很喜欢你非常笼统的DefaultFigureCreateFcn 解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 2016-09-12
  • 2015-12-26
  • 2015-06-27
  • 2020-10-27
  • 2011-06-08
相关资源
最近更新 更多