Do not use global variables to share data. You find thousands of threads concerning Matlab or other programming languages, which explain the severe problems. A direct sharing is much better:
function GUI1
handles.FigH = figure('Tag', 'GUI1');
handles.AxesH = axes;
guidata(handles.FigH, handles);
end
function GUI2
handles.FigH = figure('Tag', 'GUI2');
handles.ButtonH = uicontrol('Style', 'PushButton', 'Callback', @ButtonCB);
guidata(handles.FigH, handles);
end
function ButtonCB(ButtonH, EventData)
handlesGUI2 = guidata(ButtonH);
data = rand(100, 100);
GUI1H = findobj(allchild(groot), 'flat', 'Tag', 'GUI1');
handlesGUI1 = guidata(GUI1H);
image(data, 'Parent', handlesGUI1.AxesH);
end
Now the pressing the button in the 2nd GUI searches GUI1 at first and creates an image in its axes. You can do everything you want from inside the GUI2 callback, if you get the handles of the GUI1 at first.
It is more efficient to search "GUI1" once only during the creation of GUI2:
function GUI2
handles.FigH = figure('Tag', 'GUI2');
handles.ButtonH = uicontrol('Style', 'PushButton', 'Callback', @ButtonCB);
handles.GUI1H = findobj(allchild(groot), 'flat', 'Tag', 'GUI1');
guidata(handles.FigH, handles);
end
function ButtonCB(ButtonH, EventData)
handlesGUI2 = guidata(ButtonH);
data = rand(100, 100);
GUI1H = handles.GUI1H;
...
This works also if you use GUIDE. Then the 3rd argument handles is provided as input already and you do not have to obtain it by guidata.