我正在遇到Matlab的一个令人生气的问题,不幸的是,一个
earlier answer显然同样的问题并没有帮助我.我很抱歉这个问题很长 – 你需要相当多的信息才能重现问题(我尽可能多地修剪它……)
问题在于:无论我做什么,在使用课程后我都无法“让Matlab忘记”.使用的值似乎是持久的,对类定义的编辑不会“粘住”.在后一种情况下,错误消息是:
Warning: The class file for ‘myClass’ has been changed; but the change
cannot be applied because objects based on the old class file still
exist. If you use those objects, you might get unexpected results. You
can use the ‘clear’ command to remove those objects. See ‘help clear’
for information on how to remove those objects.
我甚至在得到那个消息之后
>> 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
没有爷爷实例,并且未触及类定义文件.然而,爷爷(我创建,然后删除)的价值在某种程度上是持久的.
当我对myClass.m文件做一个小改动,并尝试创建一个新变量(在清除全部之后)后,我得到上面显示的消息.所有这些都引出了我的问题:
Matlab隐藏了我的类的一个实例,以便变量在清除之后是持久的,如何清除工作区(不重新启动),以便类定义“重置”?
我不知道是否重要,但我使用的是Matlab 7.14.0.739(R2012a)