MxNx
MxNx

Reputation: 1374

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

Why does MATLAB open a plot window when I load a .mat file that contains a figure inside an struct?

The problem that I am facing is that I have the output of an optimization algorithm as a collection of .mat files. Each .mat file contains the state of each generation of the algorithm in a form of a single struct. The state structure has (among other variables) a field of type matlab.ui.Figure. Now, whenever I try to load any of these files with the load command, a plot window opens automatically.

MATLAB Workspace

Is there any way to stop MATLAB from from opening this plot window?

I am using MATLAB 2015rb.

Upvotes: 1

Views: 2532

Answers (1)

Suever
Suever

Reputation: 65460

The reason that it is displaying a figure is because if you look closely at your state structure, there is a figure object stored in there. When you load this graphics object (or any object, really) from a file, MATLAB will reconstruct the object. The defined behavior for loading a figure (it's loadobj method) is to open the figure.

This is a recent issue because older versions of MATLAB stored graphics handles as simply a number and when loading a graphics handle from file, MATLAB had no way of knowing that it was supposed to be a figure so it would just parse it as a number and move on without displaying a new figure window.

Unfortunately since your figure handle is nested within a struct there is no easy way to not load it. Probably the easiest thing to do would be to just delete the figure object right after loading the file (since you have the handle already).

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

And if you really don't like the figure poping up even for a second, you can set the default figure Visible property to 'off' prior to loading and then reset it afterwards.

% 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)

Another potential solution (which would not require you to know where the figure handles are in your struct) is to overwrite the DefaultFigureCreateFcn to simply delete any figure that is created.

% 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', '')

In the future, to avoid this behavior, consider not saving any graphics handles within your .mat files. They are very large objects and MATLAB actually will issue a warning when saving one to a file as it is not recommended.

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.

Upvotes: 5

Related Questions