【问题标题】:Can you obtain an unique identifier for a MATLAB object?您可以获得 MATLAB 对象的唯一标识符吗?
【发布时间】:2013-09-04 14:55:50
【问题描述】:

我正在调试一些 MATLAB 代码,并希望确保对一个对象的两个引用实际上是指同一个对象。有没有办法获取对象的唯一标识符(例如内存地址)?

据我所知,我无法将自己的 ID 添加到对象中,因为它们是 MATLAB 随机数流。

【问题讨论】:

  • 您在使用 MATLAB 的 RandStream 吗?如果是这样,它已经是一个句柄类,并且继承了相等 == 运算符 (eq)。规则是比较句柄对象时,使用eq运算符来测试对象是否是同一个句柄。使用isequal 测试对象是否具有相同的属性值,即使这些对象是不同的句柄。忽略引用语义,您可以比较两个随机数流的算法、种子和内部状态。

标签: matlab oop uniqueidentifier


【解决方案1】:

如果您使用的是 OOP,那么您可以添加一个属性 ID 并在对象的构造过程中设置它。

java.rmi.server.UID() 是获取唯一 ID 的好方法

但是== 的测试将检查实际句柄,因此这更多的是一个可用性问题。

classdef yourClass < handle

properties    
    ID
end

methods
    function obj = yourClass()
        obj.ID = java.rmi.server.UID();
    end

end

end

然后检查您的对象将相当简单。

【讨论】:

    【解决方案2】:

    如果您要比较的对象是 MATLAB 随机数流(即它们属于 RandStream 类),那么它们就是句柄对象。在这种情况下,您不需要唯一 ID:如果您使用 eq== 比较它们并且它们相等,那么它们就是同一个对象。

    正如您所说,您无法将自己的属性添加到类 RandStream 的对象中,但如果您真的想要,您可以子类化 RandStream 并将您自己的属性添加到子类中。您可以在属性中存储一个唯一标识符,由char(java.util.UUID.randomUUID) 生成。

    【讨论】:

    • 我不能轻易地比较这些引用,因为它们存在于代码的不同部分。似乎要么我必须添加代码才能进行比较,要么我必须继承 RandStream。 (我希望有一个更简单/更快的解决方案。)
    • 我猜可能有比这更简单的方法。例如,您可以在调试模式下运行代码,在您希望比较的两个引用的两个点中的每一个处停止。然后使用assignin('base',...) 将它们保存到基本工作区。然后退出调试器,然后比较它们。
    【解决方案3】:

    您可以使用每个图形对象中存在的UserData 字段来存储您生成的唯一身份。如果使用用户定义的类,您可以在您的类中添加一个类似的字段。

    可以通过使用全局计数器分配每个新身份来保持身份的唯一性。

    【讨论】:

    • UserData 根本不存在于每个对象中。它存在于所有 Handle Graphics 对象中,但这不是 OP 所要求的。
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多