Matlab 删除以前创建的句柄

Matlab 删除以前创建的句柄,matlab,user-interface,handle,Matlab,User Interface,Handle,我正在尝试删除我创建的句柄handles.roi1 我已尝试使用函数delete: delete(handles.roi1) 但它给了我一个错误: Argument must contain a string. 我的目的是删除句柄,就像我从未创建过它一样 你有什么建议或建议我怎么做 也许我没有正确地表达 我正在做一个GUI,我在一个按钮handles.roi1中定义,但我想在另一个按钮上删除它。这是因为,在该按钮上,我执行以下操作: try a=handles.roi1; catch

我正在尝试删除我创建的句柄
handles.roi1

我已尝试使用函数
delete

delete(handles.roi1)
但它给了我一个错误:

Argument must contain a string. 
我的目的是删除句柄,就像我从未创建过它一样

你有什么建议或建议我怎么做


也许我没有正确地表达

我正在做一个GUI,我在一个按钮
handles.roi1
中定义,但我想在另一个按钮上删除它。这是因为,在该按钮上,我执行以下操作:

try a=handles.roi1;
catch
    b=11;

我想让它进入
捕捉
。我试着做
handles=rmfield(handles,'roi1')但不起作用。

编辑:重写答案以匹配OP添加的信息

如果使用
imread
创建
handles.roi1

handles.roi1 = imread('test.jpg');
handles = rmfield(handles, 'roi1');
或者,先将内容存储在变量
a
中,然后将
a
复制到
handles.roi1
(在这种情况下,您有两个相同数据的副本):

然后有没有打开的文件句柄。此外,
a
句柄.roi1
相等的,它们不是文件句柄,但它们都包含图形文件
test.jpg
的彩色或灰度图像(在本例中)

在MATLAB中,通常使用
fopen
获取文件句柄,但有几个文件I/O命令不使用文件句柄,例如
imread
xlsread
fastaread
不使用文件句柄

在这种情况下,您希望(我假设)去掉结构
句柄的
roi1
handles.roi1
,在MATLAB语法中),因此您可以这样使用
rmfield

handles = rmfield(handles, 'roi1');
它将
句柄
的新副本(不带
roi1
字段)存储回名为
句柄
的同一结构

请注意,这与文件句柄或图形对象句柄无关。它只是一个名为
handles
的结构,您或某人的名称与
handles
名称混淆,尽管
imread
根本不返回任何文件句柄(或图形对象句柄)!我宁愿将它命名为
imageData
,而不是
handles
,因为这才是它真正包含的内容

另一方面,如果
handles.roi1
实际上是使用
fopen
创建的文件句柄,如下所示:

handles.roi1 = fopen('test.jpg');
fclose(handles.roi1);
在这种情况下,您将在MATLAB中拥有一个真正的打开文件句柄,您应该首先使用
fclose
关闭该文件,如下所示:

handles.roi1 = fopen('test.jpg');
fclose(handles.roi1);
或者,如果您想关闭使用
fopen
打开的所有打开的文件:

fclose('all');
然后,在
fclose
之后,如果您想去掉结构
句柄的
roi1
handles.roi1
,在MATLAB语法中),您可以这样使用
rmfield
(与
imread
的情况相同):


它将
句柄
的新副本存储到名为
句柄

的同一结构中,而不带字段
roi1
,如果您只想删除句柄的一部分,可以执行上述操作:

rmfield(handles, 'roi1');
如果要删除整个句柄,可以执行以下操作:

clear handles

你说的“删除一个句柄就像我从来没有创建过它一样”到底是什么意思?你能提供更多关于你的问题的细节吗?如何准确地创建
句柄.roi1
?是否可能重载了
删除
函数?你能在matlab的提示符中输入
哪个删除
,看看它指向哪里吗?handles.roi1是一个图像矩阵,像a=imread('friends.jpg'),我做了handles.roi1=a。但是,我想删除句柄。1。我该怎么做?你能编辑一下你的问题来扩展和澄清它吗?定义按钮的代码对于回答您的问题非常有用;h=直接;roi2=创建掩码(h);roi=roi1+roi2句柄。roi1=roi捕获h=imellipse;roi1=创建掩码(h);这个问题很难解释。我的问题是我想删除handles.roi1以强制代码再次进入catch
rmfield(句柄,'roi1')
不会改变任何东西,因为
rmfield
不是一个运算符,它是一个函数(至少在R2012a中是这样),并且没有破坏性<代码>rmfield(句柄“roi1”)
只返回结构
句柄
,不返回字段
roi1
。如果要清除字段
roi1
,则需要将
rmfield
的输出存储回
句柄(或其他地方)。