明确的GUI matlab工作空间

时间:2012-03-27 19:40:49

标签: matlab user-interface variables clear workspace

我的GUI中有一个 new 按钮,这是它的回调:

function ptlNew_ClickedCallback(hObject, eventdata, handles)  
% hObject    handle to ptlNew (see GCBO)  
% eventdata  reserved - to be defined in a future version of MATLAB  
% handles    structure with handles and user data (see GUIDATA)  
cla(handles.axes1,'reset');  
clear variables  

但是最后一行没有工作 如何清除GUI的工作区而不关闭它以填充内存? 我的变量在句柄结构中 例如,如果我有变量X,我应该在表单句柄中访问它.X
我创建了我的变量属性句柄因为我想在多个回调函数中访问它们而我不想让它们成为全局

我还试图清除一个特定的变量。所以我使用了这行代码,而不是清除变量     清除句柄。基准像素
但它也不起作用,当我尝试通过代码在下一行访问它时:
    handles.FiducialPixels
它完全按照之前的方式打印在命令窗口上 我真的很困惑我该怎么办? 有趣的问题是,行清除变量清除句柄.FiducialPixels 不会发出任何错误或警告,但他们会完成任务!

正如Li-aung Yip所说,我把电话改回了这个表格:

function ptlNew_ClickedCallback(hObject, eventdata, handles)
names = fieldnames(handles);
rmfield(handles,'FiducialPixels');
names = fieldnames(handles)
handles.FiducialPixels  

但这是运行第4行和第5行的命令行中出现的内容:

names =

'figure1'
'pnlControlPointsImageCoordinates'
'uitoolbar1'
'pnlCalculateParameters'
'mnuInteriorOrientation'
'btnLoad2'
'edtImageFile'
'text17'
'edtInteriorOrientation'
'edtF'
'text16'
'edtYPPA'
'text15'
'edtXPPA'
'text14'
'text13'
'btnBrowseLensDistortion'
'edtLensDistortion'
'text12'
'btnBrowseInteriorFile'
'text11'
'axes2'
'uitoggletool3'
'uitoggletool2'
'uitoggletool1'
'ptlNew'
'txtCalculation'
'btnJumpTo'
'btnLoad'
'edtImagePath'
'text9'
'btnSaveParameters'
'btnCalculate'
'edtNumber'
'text8'
'uitable1'
'btnGinput'
'btnBrowse'
'edtFilePath'
'text1'
'btngrpTypeOfOrientation'
'axes1'
'mnuItemControlPointsImageCoordinates'
'mnuItemCalculateParameters'
'rdbtnProjective'
'rdbtnAffine'
'rdbtnConformal'
'output'
'TableData'
'TableDataEmpty'
'Matrix'
'FiducialImageCoordinates'
'dataH'
'FiducialPixels'
'flag'
'X'

592 handle.FiducialPixels

ans =

1.0e + 003 *

7.5294    3.8246
0.1357    3.8723
3.9200    0.2311
3.8882    7.4499
7.4817    0.2311
0.2152    7.5294
0.2311    0.2311
7.4658    7.4817

你看到handle.FiducialPixels仍然存在 即使您在第三行之后使用 guidata(hObject,handles),结果也会相同

1 个答案:

答案 0 :(得分:4)

如果要绝对删除每个工作空间变量,包括脚本创建的所有工作空间(全局)变量,在命令提示符下创建的那些变量由其他脚本创建的那些变量,只需使用:

clear

但是,使用clear(每个变量)被认为是不礼貌的。这是因为用户可能在调用脚本之前在命令行上做了一些工作。当你的脚本调用clear时,他的所有作品都将被删除(永远!)


如果要删除handles.FiducialPixels - 即handles结构的特定元素 - 则clear不是您想要的。相反,请使用rmfield() function,它用于从结构中删除字段。

家庭作业:阅读struct的文档页面以及处理结构的函数:cell2struct | deal | fieldnames | getfield | isfield | isstruct | namelengthmax | orderfields | rmfield | setfield | struct2cell | substruct


修改(1):rmfield() 工作。你只是没有正确使用它。

>> figure
>> handles.h1 = uicontrol

handles = 

    h1: 329.0011

>> handles.h2 = uicontrol

handles = 

    h1: 329.0011
    h2: 0.0016

>> handles = rmfield(handles, 'h1')

handles = 

    h2: 0.0016

来自doc rmfield

  

<强> rmfield

     

从结构中删除字段

     

<强>语法

     

s = rmfield(s, 'fieldname')

     

s = rmfield(s, fields)

     

<强>描述

     

s = rmfield(s, 'fieldname')从中删除指定的字段   结构数组s

     

s = rmfield(s, fields)一次删除多个字段。 fields   是字符串的字符数组或字符串的单元格数组。

请注意,调用约定s = rmfield(...)表示rmfield 返回。在这种情况下,原始结构s 不会被修改。相反,rmfield()会返回结构,而不会指定您要删除的字段。