Matlabのオブジェクトの値渡し
はじめに
Matlabでは、オブジェクトのプロパティを
可変にする場合、handleクラスを継承して書き始めます。
まず下のようなクラスファイルを準備してみてください。
classdef SpecializedCopy < handle
properties
Prop1
Prop2 = datestr(now)
end
methods(Access = protected)
function cp = copyElement(obj)
cp = SpecializedCopy;
cp.Prop1 = obj.Prop1;
cp.Prop2 = datestr(now);
end
end
end
そのあとで、次のように実行していくと、
matlabのhandleクラスが参照渡しであることがわかります。
>> a = SpecializedCopy
a =
SpecializedCopy with properties:
Prop1: []
Prop2: '29-Jun-2017 10:54:19'
>> a.Prop1 = 'not copyable';
>> b = a
b =
SpecializedCopy with properties:
Prop1: 'not copyable'
Prop2: '29-Jun-2017 10:54:19'
>> b.Prop1 = 'change a property'
b =
SpecializedCopy with properties:
Prop1: 'change a property'
Prop2: '29-Jun-2017 10:54:19'
>> a
a =
SpecializedCopy with properties:
Prop1: 'change a property'
Prop2: '29-Jun-2017 10:54:19'
オブジェクトの値渡し
参照渡しをすると、コピーしたはずのオブジェクトのpropertyを書き換えたとき、
元々のオブジェクトのプロパティも書き換わり望ましくない挙動をすることがあります。
そこで、値渡しの出番です。
handle
クラスの代わりに、matlab.mixin.Copyable
を
継承してクラスを書けば実現できます。
実装・実行例
クラスファイルをまず下のように書きます。
classdef SpecializedCopy < matlab.mixin.Copyable
properties
Prop1
Prop2 = datestr(now)
end
methods(Access = protected)
function cp = copyElement(obj)
cp = SpecializedCopy;
cp.Prop1 = obj.Prop1;
cp.Prop2 = datestr(now);
end
end
end
コンソールにて、下のように実行すれば、オブジェクトをコピーすると
値渡しが実現出来ていることが確認できると思います。
>> a = SpecializedCopy;
>> a
a =
SpecializedCopy with properties:
Prop1: []
Prop2: '29-Jun-2017 10:50:58'
>> a.Prop1 = 'copyable';
>> b = copy(a)
b =
SpecializedCopy with properties:
Prop1: 'copyable'
Prop2: '29-Jun-2017 10:51:19'
>> b.Prop1 = 'rewritten'
b =
SpecializedCopy with properties:
Prop1: 'rewritten'
Prop2: '29-Jun-2017 10:51:19'
>> a
a =
SpecializedCopy with properties:
Prop1: 'copyable'
Prop2: '29-Jun-2017 10:50:58'
参考文献
Author And Source
この問題について(Matlabのオブジェクトの値渡し), 我々は、より多くの情報をここで見つけました https://qiita.com/sshojiro/items/eb9c19e5060f52a615b1著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .