Matlabのオブジェクトの値渡し


はじめに

Matlabでは、オブジェクトのプロパティを
可変にする場合、handleクラスを継承して書き始めます。

まず下のようなクラスファイルを準備してみてください。

SpecializedCopy.m
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
継承してクラスを書けば実現できます。

実装・実行例

クラスファイルをまず下のように書きます。

SpecializedCopy.m
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'

参考文献

オブジェクトのコピー - MATLAB & Simulink - MathWorks 日本