无法更新 Matlab 中的类定义

2023-12-11

我在使用 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)


您有一个中间实例myClass.fatherMATLAB 不会破坏它。你必须delete你自己

>> clear grandpa
>> delete(son.precursors{1})
>> clear son
>> clear classes
>> son = myClass.son
son = 
    son    
>> sumVal(son)
ans =
     6

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

    function delete(obj)
        if isa(obj.precursors{1}, 'myClass')
            delete(obj.precursors{1});
        end
    end

and use delete(son)而不是把它留给clear功能来破坏。您可以将此扩展到您的案例并递归删除树中的所有实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法更新 Matlab 中的类定义 的相关文章

  • 已删除的类实例上的方法仍然有效吗?

    我在 Visual C 2010 上有这段代码 include
  • 公共领域有哪些替代方案?

    我正在用 java 编写一个游戏 正如问题标题建议的那样 我在类中使用公共字段 暂且 据我所知 公共领域很糟糕 我有一些理解其中的原因 但如果有人能澄清为什么你不应该使用它们 那将不胜感激 问题是 从我所看到的来看 这似乎是合乎逻辑的 是使
  • 比较一个类的两个实例

    我有一堂这样的课 public class TestData public string Name get set public string type get set public List
  • 将值从 C++ MEX 文件返回到 MATLAB

    我正在编写一个从 C 代码中检索数据的 MATLAB 程序 为此 我在 MATLAB 中创建了一个 MEX 文件和一个网关 mexFunction 虽然可以在 MATLAB 中读取读取值 但我无法检索它来使用它 如果不清楚 我有与这里完全相
  • 具有成员 std::mutex (或其他不可复制对象)的类的复制或移动构造函数?

    class A private class B private std mutex mu A parent NULL public B A const parent ptr parent parent ptr B const A B b c
  • 从另一个类添加 Swing 组件

    我正在学习java 我正在尝试从另一个类向我的框架添加一个菜单栏 练习将代码划分为多个类以更好地组织程序 这是我的代码示例 public class MainApp public static void main String args C
  • C++ 实现友元/内联函数

    我似乎找不到这个新手问题的答案 如果我有课 头文件 h Class X public friend bool operator const X const X inline size type rows const ETC 当我去实现X的
  • MATLAB 符号替换

    我知道在 MATLAB 中如果声明了 syms x y f x 2 y 2 grad gradient f 然后grad会存储值 2 x 2 y 如果我想评估梯度 2 2 I use subs f x y 2 2 这返回 4 4 我正在编写
  • MATLAB;具有 2+ 个/分割图例的饼图 R2017b

    我正在创建一个饼图 理想情况下希望图例水平显示在顶部和 或底部 然而 在几乎所有情况下 这是不可能的 因为图例超出了数字 因此 我理想情况下希望将图例分成两个 或更多 子图例并单独放置它们 我知道这不是 MATLAB 中的内置功能 我使用的
  • 如何获取Python对象父级?

    所以 我试图获取自定义对象 内部 的对象 这是一个例子 假设 o 是一个对象 无论是什么类型 它都可以存储变量 o Object class Test def init self self parent o This is where I
  • 在matlab中融合2个以上的图像

    在 MATLAB 中 如何融合两个以上的图像 例如 我想要做什么imfuse但对于超过 2 个图像 使用两张图像 这是我的代码 A imread file1 jpg B imread file2 jpg C imfuse A B blend
  • 将带有 **kwargs 错误的值线程化并传递给 TypeError

    我对 Python 还很陌生 并且正在通过这篇文章研究如何使用线程来处理某些代码 Python 使用线程或队列迭代调用函数的 for 循环 https stackoverflow com questions 12868956 python
  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 90 175 600 650 655 660 代入矩阵 90 175 600 650 655 660 175 600 650 655 660 655 600 650 655 660 655 650 650 655 66
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac
  • JPA - 从一列中获取不同的价值

    我有一个只有几个字段的实体 其中之一是城市名称 现在我想从该表中获取所有不同城市的列表 我怎样才能存档它 我尝试使用 DISTINCT 关键字 但它不起作用 我使用 Hibernate 作为 JPA 提供程序 但我想在纯 JPA 查询中获取
  • Python:如何“杀死”类实例/对象?

    我希望 Roach 类在达到一定量的 饥饿 时 死亡 但我不知道如何删除该实例 我的术语可能有误 但我的意思是 窗户上有大量 蟑螂 我希望特定的蟑螂完全消失 我会向您展示代码 但它很长 我将蟑螂类添加到策划者类蟑螂种群列表中 一般来说 每个
  • Java加减法与金钱

    我正在尝试对美元和美分进行加法和减法 但在超过 100 美分和低于 0 美分时遇到困难 我的代码可以很好地添加任何内容 直到我需要将 100 美分转换为 1 美元 我无法将我的话转化为代码 但我知道需要做什么才能将美分转换成美元 仅供参考
  • 如何使用神经网络保存 Sift 特征向量进行分类

    SIFT 特征的 Matlab 实现发现于http www cs ubc ca lowe keypoints http www cs ubc ca lowe keypoints 在 stackoverflow 的帮助下 我想将功能保存到 m

随机推荐