4

このクラスのオブジェクトを他の関数と同じように呼び出すことができるようにMATLABクラスを定義することは可能ですか?

IOW、次のPythonクラスのようなものに相当するものをMATLABで記述できるかどうかを尋ねています。

# define the class FxnClass
class FxnClass(object):
    def __init__(self, template):
        self.template = template

    def __call__(self, x, y, z):
        print self.template % locals()

# create an instance of FxnClass
f = FxnClass('x is %(x)r; y is %(y)r; z is %(z)r')

# call the instance of FxnClass
f(3, 'two', False)

...
[OUTPUT]
x is 3; y is 'two'; z is False

ありがとう!

4

4 に答える 4

5

MATLAB が必要なものを直接サポートしているかどうかはわかりませんが、MATLAB はファーストクラスの関数をサポートしています。したがって、クロージャーは使用可能な代替手段を提供する可能性があります。たとえば、次のようになります。

function f = count_call(msg)
    calls = 0;

    function current_count()
        disp(strcat(msg, num2str(calls)));
        calls = calls + 1;
    end

    f = @current_count;
end

この場合、(および) をcurrent_count閉じます。そうすれば、何らかの内部状態に依存する関数を表現できます。次のように使用します。callsmsg

g = count_call('number of calls: ') % returns a new function ("__init__")
g()                                 % "__call__"
于 2012-08-31T23:11:26.047 に答える
4

MatlabでJavaメソッドを作成するだけでこれが可能かどうかを知りたいです。私はあなたが次のことができることを知っています

classdef ExampleObject
    properties
        test;
    end
    methods
        function exampleObject = ExampleObject(inputTest)
            exampleObject.test=inputTest;
        end
        function f(exampleObject,funcInput)
            disp(funcInput+exampleObject.test);
        end
    end
end

>> e=ExampleObject(5);
>> f(e,10)
    15

しかし、私の知る限り、 call 関数をオーバーライドしようとすると、Matlab の括弧内の添字参照 と競合することになりますsubsrefそれを上書きする方法を示す参照をここで見つけることができます。それをあなたが望むようにすることができるかもしれません...しかし、そうするのは良い形ではないようです. これと混乱することなく、Matlab が (関数ではなく) オブジェクトへの呼び出しをどのように処理するかはわかりません。

于 2012-08-31T23:14:04.047 に答える
1

通常の関数のように使用するメソッドをクラスに保持させたい場合 (たとえば、m ファイルで定義)、はい、Matlab は静的メソッドをサポートしています。

静的メソッドは、そのクラスのインスタンスとは独立して実行されます。実際、静的メソッドを使用するためにクラスをインスタンス化する必要さえありません。

ただし、Matlab はstatic fieldsをサポートしていないため、最初にそのようなクラスをインスタンス化し、関数を使用する前にそのフィールドを設定する必要があります (この質問をしているので、おそらくこれらのフィールドを使用します)。

Frank で説明されているように、静的メンバーの制限を考えると、クロージャーを使用したほうがよい場合があります。

于 2012-08-31T23:16:01.107 に答える