我在使用 Matlab 时遇到了一个令人恼火的问题,并且先前的回答不幸的是,显然同样的问题对我没有帮助。我很抱歉这个问题相当长 - 你需要相当多的信息来重现这个问题(我试图尽可能地修剪它......)
问题是这样的:无论我做什么,在我使用过一个类之后我都不能“让Matlab忘记”。使用的值似乎是持久的,并且对类定义的编辑不会“粘住”。在后一种情况下,错误消息是:
警告:“myClass”的类文件已更改;但改变
无法应用,因为基于旧类文件的对象仍然存在
存在。如果您使用这些对象,您可能会得到意想不到的结果。你
可以使用“clear”命令删除这些对象。请参阅“帮助清除”
有关如何删除这些对象的信息。
即使在之后我也收到了这条消息
>> clear all
>> clear functions
>> clear ans
尽管我试图清除它,但不知何故,类定义仍然是持久的。更糟糕的是,当我修改类实例的值然后清除它时,该值在某种程度上并没有“忘记”。为了说明这一点,这里是源代码myClass
:
% a simple class definition that shows the problem that I cannot
% figure out how to redefine a class without restarting Matlab
classdef myClass < handle
properties
precursors = {'none'};
numPre = {1};
value = 1;
end
methods
function obj = myClass(pre, num, val)
% constructor
if nargin > 0
obj.precursors = pre;
obj.numPre = num;
obj.value = val;
end
end
function v = sumVal(obj)
% find the sum of the value of all precursors
n = numel(obj.precursors);
v = 0;
for ii = 1:n
pc = obj.precursors{ii};
if isa(pc, 'myClass')
if ii==1
v = 0;
end
v = v + sumVal(pc) * obj.numPre{ii};
else
v = obj.value;
end
end
end
end
% only the following named instances may exist:
enumeration
grandpa ({'none'}, {1}, 1)
father ({myClass.grandpa}, {3}, -1)
son ({myClass.father}, {2}, -1)
end
end
在 Matlab 的新实例中,我执行以下操作:
>> son = myClass.son;
>> sumVal(son)
ans =
6
>> grandpa = myClass.grandpa;
>> grandpa.value = 5;
>> sumVal(son)
ans =
30
到目前为止,一切都很好。这sumVal
函数发现父亲和祖父,并且sumVal
计算正确(第一种情况为 6 * 1,第二种情况为 6 * 5)。
现在我删除“一切”(我认为):
>> clear all
>> clear functions
>> clear ans
我只创建一个变量:
>> son = myClass.son;
现在关键来了——意想不到的答案
>> sumVal(son)
ans =
30
当我检查加载的变量时,我发现
>> whos
Name Size Bytes Class Attributes
son 1x1 112 myClass
没有grandpa
实例,并且类定义文件没有被触及。然而,价值grandpa
(我创建,然后删除)在某种程度上是持久的。
当我对myClass.m
文件,并尝试创建一个新变量(在clear all
),我收到上面显示的消息。所有这些引出了我的问题:
Matlab 在哪里隐藏我的类的实例,以便变量在clear all
,以及如何清除工作区(无需重新启动)以便“重置”类定义?
我不知道这是否重要,但我正在使用 Matlab 7.14.0.739 (R2012a)