【问题标题】:clear workspace of GUI matlabGUI matlab的清除工作区
【发布时间】:2012-04-11 09:30:29
【问题描述】:

我的 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
我将变量属性设置为句柄,因为我想在多个回调函数中访问它们并且我不想将它们设为全局

我还尝试清除特定变量。所以我使用了这行代码而不是 clear variables
清除手柄。FiducialPixels
但它也不起作用,当我尝试在下一行通过代码访问它时:
句柄.FiducialPixels
它像以前一样打印在命令窗口上
我真的很困惑我该怎么办? 有趣的问题是 clear variablesclear handles.FiducialPixels 行不会产生任何错误或警告,但它们会完成任务!

当 Li-aung Yip 接电话时,我将电话改回了这种形式:

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

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

名字 =

'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 个句柄.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

您会看到handles.FiducialPixels 仍然存在
即使在第三行之后使用guidata(hObject,handles),结果还是一样的

【问题讨论】:

  • 你能澄清一下你想清除哪个变量——全部吗? X?手柄?您可以使用 clear var_name 清除单个变量。另外,你能澄清一下“最后一行不起作用”的意思吗?
  • 我想清除我在程序中创建的所有变量,即使它们在句柄结构中(因为你知道句柄结构还有一些其他成员,比如按钮的标签和它们的其他属性,我不知道不希望清除这些变量,因为这样我的 GUI 将被清除)但是我创建的用于进行一些计算和处理的变量应该被清除。我的意思是 clear variables 作为最后一行

标签: matlab user-interface variables workspace


【解决方案1】:

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

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() 返回一个 new 结构,没有您指定删除的字段。

【讨论】:

  • 那是因为您没有阅读rmfield 的文档。见上文。
猜你喜欢
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2016-09-24
  • 2011-06-30
  • 1970-01-01
  • 2015-05-26
相关资源
最近更新 更多