我的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),结果也会相同
答案 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()
会返回新结构,而不会指定您要删除的字段。