无法在Matlab中更新类定义

Flo*_*ris 4 matlab persistence class

我遇到了Matlab的一个令人生气的问题,不幸的是,早期的回答显然同样的问题并没有帮助我.我很抱歉这个问题很长 - 你需要相当多的信息才能重现问题(我尽可能多地修剪它......)

问题在于:无论我做什么,在使用课程后我都无法"让Matlab忘记".使用的值似乎是持久的,对类定义的编辑不会"粘住".在后一种情况下,错误消息是:

警告:'myClass'的类文​​件已更改; 但是无法应用更改,因为基于旧类文件的对象仍然存在.如果使用这些对象,可能会得到意外结果.您可以使用'clear'命令删除这些对象.有关如何删除这些对象的信息,请参阅"帮助清除".

我甚至在得到那个消息之后

>> clear all
>> clear functions
>> clear ans
Run Code Online (Sandbox Code Playgroud)

尽管我试图清除它,但不知何故,类定义是持久的.更糟糕的是,当我修改类的实例的值,然后清除它时,值不会被"遗忘".为了说明,这里是源代码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
Run Code Online (Sandbox Code Playgroud)

在Matlab的新实例中,我执行以下操作:

>> son = myClass.son;
>> sumVal(son)

ans = 

     6

>> grandpa = myClass.grandpa;
>> grandpa.value = 5;
>> sumVal(son)

ans =

    30
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.该sumVal函数发现父亲和祖父,并且sumVal计算正确(第一种情况下为6*1,第二种情况下为6*5).

现在我删除"一切"(我认为):

>> clear all
>> clear functions
>> clear ans
Run Code Online (Sandbox Code Playgroud)

我只创建一个变量:

>> son = myClass.son;
Run Code Online (Sandbox Code Playgroud)

现在是踢球者 - 意想不到的答案

>> sumVal(son)

ans =

    30
Run Code Online (Sandbox Code Playgroud)

当我检查加载的变量时,我发现

>> whos
Name    Size       Bytes  Class     Attributes

son      1x1         112  myClass
Run Code Online (Sandbox Code Playgroud)

没有grandpa实例,并且未触及类定义文件.然而,grandpa(我创建,然后删除)的价值在某种程度上是持久的.

当我对myClass.m文件做一个小改动,并尝试创建一个新变量(在a之后clear all)时,我得到上面显示的消息.所有这些都引出了我的问题:

Matlab在哪里隐藏我的类的实例,以便变量在a之后是持久的clear all,如何清除工作空间(不重新启动)所以类定义是"重置"?

我不知道是否重要,但我使用的是Matlab 7.14.0.739(R2012a)

Moh*_*nia 6

你有一个myClass.father没有被MATLAB破坏的中间实例.你必须delete自己做

>> clear grandpa
>> delete(son.precursors{1})
>> clear son
>> clear classes
>> son = myClass.son
son = 
    son    
>> sumVal(son)
ans =
     6
Run Code Online (Sandbox Code Playgroud)

编辑:或者,您可以在类中添加析构函数

    function delete(obj)
        if isa(obj.precursors{1}, 'myClass')
            delete(obj.precursors{1});
        end
    end
Run Code Online (Sandbox Code Playgroud)

并使用delete(son)而不是让它clear破坏功能.您可以将其扩展到您的案例,并递归删除树中的所有实例.