3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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 日本

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?