web-dev-qa-db-ja.com

Matlabオブジェクトのプロパティを変更する方法

次のようなMATLABクラスを作成しました。

_classdef myclass

  properties
      x_array = [];
  end

  methods
    function increment(obj,value)
       obj.x_array = [obj.x_array ; value);
    end
  end
end
_

問題は、increment()関数を呼び出したときにプロパティ_x_array_が変更されないことです。例:

_>>s = myclass
>>increment(s,5)

>>s.x_array
ans = []
_

調査を行ったところ、MATLABがオブジェクトにLazy Copyを使用しているため、クラスにHANDLEクラスを継承させることでこれを解決できたはずであるという結論に達しましたが、解決できませんでした。なぜこれが発生するのか誰にもわかりません。そして、ハンドルクラスを拡張することが解決策ではない場合、これはそれを行う正しい方法ではありません:

_classdef myclass < handle
_

または追加の手順はありますか?

24
user34830

これは この質問 に似ています。要するに、あなたがしなければならないのは、ハンドルクラスから継承することだけです。

簡単な例

ファイルmyclass.mの内容

classdef myclass<handle
    properties
        x_array = []
    end
    methods
        function obj=increment(obj,val)
            obj.x_array=[obj.x_array val];
        end
    end
end

これで、Matlabコマンドプロンプトから、次のことができます。

>> s=myclass;
>> s.increment(5)
>> s.increment(6)
>> s

s = 

myclass handle

properties:
    x_array: [5 6]

lists of methods, events, superclasses
25
Azim

もっと簡単な方法があります。次のように、最初のインスタンスsを上書きするだけで済みます。

s = increment(s,5);

詳細情報 ドキュメント内

PS:handleを使用することは問題ありませんが、コピー関数の動作方法は異なるため、使用方法に注意する必要があります。 handleを使用すると、実際にはobjへの新しいアドレス/参照を作成します

0