代码之家  ›  专栏  ›  技术社区  ›  Amarth Gûl

Matlab改变属性值的方法

  •  0
  • Amarth Gûl  · 技术社区  · 7 年前

    我试图通过调用一个类的成员函数来更改该类的属性值:

    p1 = tank();
    p1.checkOri(p1);
    

    在类定义中,我有一个静态方法:

    classdef tank
        properties
            value
            ...
        end
    
        methods 
            ...
    
        methods (Static)
            function obj = checkOri(obj)
                if (CONDITION) %the thing I want it to do
                    obj.value = EXPRESSION;
                    ...
    

    然而这个 checkOri 方法无效。但是如果我把这个方法写在主文件中,或者说改变 p1 -类的实例 tank -它工作完美:

    p1 = tank();
    p1.checkOri(p1);
    if (CONDITION) %the thing I want it to do
        p1.value = EXPRESSION;
    

    它工作得很好。

    我想知道这是什么原因造成的。从我使用其他编程语言的经验来看,调用方法应该是可行的,是因为使用了Matlab语法还是静态方法的一些技巧?我如何修复它,使此方法能够工作?

    0 回复  |  直到 7 年前
        1
  •  1
  •   Amarth Gûl    7 年前

    因此,正如@Navan在评论中所说,handle类可能是一个解决方案。

    Matlab似乎与Java和C++具有类似的参数概念,在函数/方法中修改的参数只保留在函数/方法中修改的参数。

    对于这个类,我只是添加了 < handle 在班组长的定义中,它起到了作用:

    classdef tank < handle
    properties
        ...
    

    但我不确定这是否是唯一的解决方案,也许有更好的方法可以做到这一点。所以我将这个问题留待讨论,非常欢迎您发表您的意见:D

        2
  •  1
  •   Cris Luengo    7 年前

    在MATLAB中,调用

    p1.checkOri();
    

    相当于

    checkOri(p1);
    

    在这两种情况下,类方法 checkOri 为对象类调用 p1 p1级 按价值 .

    因为 p1级 是按值传递的,则调用工作区中的对象看不到在函数内对其所做的任何更改。因此,人们通常会这样做

    p1 = checkOri(p1);
    

    如果方法编写如下:

    function obj = checkOri(obj)
    %...
    end
    

    然后,MATLAB将优化上述函数调用,使对象实际上没有复制。注意,在函数声明和函数调用中,输入和输出变量都是相同的。

    正如OP已经发现的那样,上述情况并不适用于 句柄类 ,继承自的类 handle . 这些类的行为就像它们总是通过引用传递一样,在任何工作空间中对它们所做的任何更改都将反映在其他工作空间中的所有其他副本中。

    此外,分配给成员变量并不遵循上述步骤,因此

    p1.value = 0;
    

    修改对象 p1级 .

    有关值类和句柄类之间差异的更多信息,请参阅 this other question .