【问题标题】:Matlab - Function taking no arguments within a classMatlab - 在类中不带参数的函数
【发布时间】:2014-07-04 15:35:59
【问题描述】:

由于我似乎无法编辑我的旧问题 (Matlab - Function taking no arguments but not static),所以又来了:

我正在尝试实现以下内容:

classdef asset
    properties
        name
        values
    end    

    methods

        function AS = asset(name, values)
            AS.name = name;
            AS.values = values;
        end

        function out = somefunction1
            ret = somefunction2(asset.values);
            out = mean(ret);
            return
        end

        function rets = somefunction2(vals)
            n = length(vals);
            rets = zeros(1,n-1);
            for i=1:(n-1)
                rets(i) = vals(i)/vals(i+1);
            end
            return
        end
    end
end

但是我得到了 somefunction1 应该是静态的错误。但是如果它是静态的,那么它就不能再访问这些属性了。我该如何解决这个问题?

基本上我希望能够写出这样的东西:

AS = asset('testname',[1 2 3 4 5]);
output = AS.somefunction1();

相对于写作

AS = asset('testname',[1 2 3 4 5]);
output = AS.somefunction1(AS);

【问题讨论】:

    标签: matlab function class


    【解决方案1】:

    要在方法中访问对象的属性,您需要将该对象作为参数传递给方法。如果不需要特定对象来执行功能,则将其设为静态(属于类,但不对特定对象进行操作)。

    那么,对比一下原代码:

    methods
    
        % ...
    
        function out = somefunction1
            ret = somefunction2(asset.values);
            out = mean(ret);
            return
        end;
    
        function rets = somefunction2(vals)
            n = length(vals);
            rets = zeros(1,n-1);
            for i=1:(n-1)
                rets(i) = vals(i)/vals(i+1);
            end
            return
        end
    end
    

    使用正确的代码:

    methods
    
        % ...
    
        % this function needs an object to get the data from,
        % so it's not static, and has the object as parameter.
    
        function out = somefunction1(obj)
            ret = asset.somefunction2(obj.values);
            out = mean(ret);
        end;
    end;
    
    methods(Static)
        % this function doesn't depend on a specific object,
        % so it's static.
    
        function rets = somefunction2(vals)
            n = length(vals);
            rets = zeros(1,n-1);
            for i=1:(n-1)
                rets(i) = vals(i)/vals(i+1);
            end;
        end;
    end;
    

    要调用该方法,您确实需要编写(请测试):

    AS = asset('testname',[1 2 3 4 5]);
    output = AS.somefunction1();
    

    因为在 MATLAB 中,99.99% 的情况相当于:

    AS = asset('testname',[1 2 3 4 5]);
    output = somefunction1(AS);
    

    当您为类重写 subsref 时,或者当传递给方法的对象不是参数列表中的第一个时,就会出现差异(但这些情况您现在不应该关心,直到您阐明 MATLAB 类语义)。

    【讨论】:

    • 非常感谢。它似乎工作。但是,Matlab 怎么知道虽然我在调用 AS.somefunction1() 时没有传递任何“obj”,但我的意思是实际上是 AS?
    • @user3805919 这说来话长,但基本上,MATLAB 会检查 AS 的类型,发现它是一个对象,因此检查名称 somefunction1 以查看是属性还是方法.如果是属性则返回值,如果是方法则静默传递对象,即 AS 作为方法的第一个参数。在我们的例子中是唯一的论点。
    • @user3805919 如果您选择我的帖子作为您问题的答案,我将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    相关资源
    最近更新 更多