ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

インデックス付きの参照と割り当て

概要

この節では、インデックス付きの参照と割り当てが MATLAB でどのように機能するかを説明し、ユーザーが変更できる動作について説明します。既定のインデックスの機能を変更するクラスの例もあります。

MATLAB は既定でオブジェクト配列にインデックスを付けます。多くのクラス設計でこの動作を変更する必要はありません。この節では、オブジェクトのインデックス付けの変更がクラス設計に有効であるかどうかを知る方法やそのような変更を行う方法を説明します。

既定のインデックス付けの参照と割り当て

MATLAB 配列により、特定の配列要素のインデックスを指定する、添字による表記を使用して、配列の要素の参照と割り当てが可能になります。たとえば、関数 randi と連結を使用して、数の 2 つの配列を作成するものとします。

% Create a 3-by-4 array of integers between 1 and 9
A = randi(9,3,4)

A =

     4     8     5     7
     4     2     6     3
     7     5     7     7
% Create a 1-by-3 array of the numbers 3, 6, 9
B = [3 6 9];

かっこでインデックスの値を使用して、いずれかの配列の要素を参照して割り当てることができます。

B(2) = A(3,4);
B
B =
     3     7     9

インデックス付きの参照を含むステートメントを実行すると、

C = A(3,4);

MATLAB は組み込みの関数 subsref を呼び出し、ステートメントをどのように解釈するか決めます。同様に、インデックス付きの割り当てを含むステートメントを実行すると、

C(4) = 7;

MATLAB は組み込み関数 subsasgn を呼び出し、ステートメントをどのように解釈するか決めます。

MATLAB の関数 subsrefsubsasgn は、既定ではユーザー定義オブジェクトと共に動作します。たとえば、同じクラスに属するオブジェクトの配列を作成するものとします。

for k=1:3
   objArray(k) = MyClass;
end

オブジェクト配列 objArray の 2 つ目の要素を参照すると、k = 2 のときに作成されるオブジェクトを返します。

D = objArray(2);
class(D)

ans =

MyClass

同じクラスに属するオブジェクトの配列、または初期化されていない変数に対してオブジェクトを割り当てることもできます (関連する情報は、「空配列の作成」を参照してください)。

newArray(3,4) = D;

オブジェクトの配列は、MATLAB の数値配列のような機能をもちます。ユーザー クラスにこの動作を行う特別のメソッドを実装する必要はありません。

配列のインデックスに関する一般的な情報は、「行列のインデックス」を参照してください。

変更できること

subsrefsubsasgn というクラス メソッドを実装することで、クラスの既定のインデックス付き参照や割り当ての動作を変更できます。構文の説明として、それぞれのリファレンス ページを参照してください。subsref または subsasgn メソッドをいったんユーザー クラスに追加したら、MATLAB は組み込み関数ではなく、クラス メソッドのみを呼び出すことに注意してください。したがって、ユーザー クラスでサポートしようとする、インデックス付きの参照と割り当ての操作すべてを、ユーザー クラス メソッドで実装しなければなりません。これは、以下を含みます。

  • クラス メソッドに対するドット表記の呼び出し

  • プロパティを含むドット表記の参照と割り当て

  • かっこ '()' を使用するインデックス

  • 中かっこ '{}' を使用するインデックス

subsrefsubsasgn メソッドを実装しているとき、ユーザー クラスのオブジェクトに対するインデックス式の解釈を完全に決めます。MATLAB が既定で与えるのと同じ動作を提供すると、複雑になることがあります。

インデックス機能を変更する場合

オブジェクト配列に対して MATLAB でサポートされる既定のインデックスや、プロパティやメソッドへのアクセスのためのドット表記により、ユーザー定義のオブジェクトが doublestruct などの、固有のクラスのように動作することができます。たとえば、数値データの配列を含む Data というプロパティをもつクラスを定義するものとします。次の式

obj.Data(2,3)

は、配列の 2 番目の行と 3 番目の列に含まれる値を返します。オブジェクトの配列では、以下のような式を使用できます。

objArray(3).Data(4:end)

これは、オブジェクト配列 objArray の 3 つ目のオブジェクトの Data プロパティに含まれる配列の 4 番目から最後までの要素を返します。

ユーザー クラス設計において、既定で MATLAB が提供するものとは異なる動作が必要になる場合、既定のインデックスの動作を変更してください。

クラス メソッド内の subsref と subsasgn — 組み込みの呼び出し

MATLAB は、クラス自身のメソッド内の、インデックス付きの参照と割り当てに対して、クラス定義の subsref または subsasgn メソッドを呼び出しません。クラス メソッド内で、クラスがそれ自身のメソッドを定義するかどうかにかかわらず、MATLAB® は常に組み込みの subsref 関数と subsasgn 関数を呼び出します。これは、クラス定義の subsrefsubsasgn メソッドにも当てはまります。

たとえば、クラス メソッド内で、以下のドット参照を実行します。

% Calls built-in subsref
obj.Prop

このドット参照は、組み込み関数 subsref を呼び出します。クラス定義された subsref メソッドを呼び出すには、以下を使用します。

% Calls overloaded subsref
subsref(obj,substruct('.','Prop'))

クラス メソッドがクラス定義された subsref メソッドまたは subsasgn メソッドの機能を必要とする場合は、演算子 '()''{}'、または '.' を使用するのではなく、関数呼び出しでオーバーロードされたメソッドを呼び出す必要があります。

たとえば、多項式が、添字に等しい独立変数の値で評価されるようにする、subsref メソッドをもつ多項式クラスを定義するものとします。次のステートメントは、その係数をもつ多項式を定義します。

p = polynom([1 0 -2 -5]);

結果の多項式に対する MATLAB 式は次のようになります。

x^3 - 2*x - 5

以下の添字付きの式は、x = 3 における多項式の値を返します。

p(3)
ans =
    16

他のクラス メソッドでこの機能を使用するものとします。そのために、関数 subsref を直接呼び出してください。evalEqual メソッドは、2 つの polynom オブジェクトと評価する点での多項式の値を受け入れます。

methods
   function ToF = evalEqual(p1,p2,x)
      % Create arguments for subsref
      subs.type = '()';
      subs.subs = {x};
      % Need to call subsref explicity 
      y1 = subsref(p1,subs);
      y2 = subsref(p2,subs);
      if y1 == y2
         ToF = true;
      else 
         ToF = false;
      end
   end
end

この動作により、指定した動作を実装する、MATLAB の標準のインデックス付けが使用できます。組み込みとクラスで変更したインデックスの使い方の例は、「変更したインデックスをもつクラス」を参照してください。

インデックス付きの参照を理解する

オブジェクトのインデックス付き参照は、丸かっこ、中かっこ、name の 3 つの形式です。

A(I)
A{I}
A.name

これらのステートメントそれぞれは、A のクラスが subsref メソッドを実装しない場合、MATLAB によりクラス Asubsref メソッド、または組み込みの関数 subsref が呼び出されます。

MATLAB は subsref に 2 つの引数を渡します。

B = subsref(A,S)

最初の引数は、参照されているオブジェクト A です。2 つ目の引数 S は、2 つのフィールドをもつ struct 配列です。

  • S.type は、'()', '{}', または '.' を含む文字列で、使用される添字のタイプを指定します。

  • S.subs は、実際のインデックスまたは名前を含むセル配列または文字列です。インデックスとして使われるコロンは、文字列 ':' としてセル配列に渡されます。コロンを使用して指定される範囲 (例、2:5) は、2 3 4 5 と展開されます。

たとえば、次の式

A(1:4,:)

は、MATLAB が subsref(A,S) を呼び出すようにします。ここで S は以下をもつ 1 x 1 の構造体です。

S.type = '()'
S.subs = {1:4,':'} % A 2-element cell array 
                   % containing the numbers 1 2 3 4 and ":"

S.subs の各セルの内容を返すと、1 番目の次元のインデックス値と、2 番目の次元の文字列 ':' が与えられます。

S.subs{:}
ans =

     1     2     3     4

ans =

:

既定の subsref は行 1 から行 4 の配列の要素すべてと、配列内の列すべてを返します。

同様に、式

A{1:4}

は、以下を使用します。

S.type ='{}'
S.subs = {1:4} % A cell array
               % containing the numbers 1 2 3 4

既定の subsref は、行 1 から行 4 のセル配列の要素すべての内容と、配列のすべての列を返します。

A.Name

は、次の値をもつ subsref(A,S) を呼び出します。

S.type = '.'
S.subs = 'Name' % The string 'Name'

既定の subsref は、A がオブジェクトであり、指定したプロパティ名をもつ場合、struct 配列の Name フィールドの内容、または Name プロパティの値を返します。

複雑なインデックスをもつ参照

これらの簡単な呼び出しは、より複雑なインデックス式で組み合わされます。そのような場合、length(S) はインデックスのレベルの数です。たとえば、

A(1,2).PropertyName(1:4)

は、subsref(A,S), を呼び出します。ここで、S は次の値をもつ 3 行 1 列の構造体配列です。

S(1).type = '()'    S(2).type = '.'              S(3).type = '()'
S(1).subs = {1,2}   S(2).subs = 'PropertyName'   S(3).subs = {1:4}

subsref の記述

クラスの subsref メソッドは、MATLAB で渡される、インデックス式を解釈する必要があります。クラスがサポートする動作は、subsref で実装されなければなりません。ただし、メソッドは、組み込みの subsref を呼び出し、変更しないインデックスのタイプを取り扱います。

switch ステートメントを使用して、使用されるインデックスのタイプを決め、実際のインデックスを取得できます。次に示す 3 通りのコードは、入力引数の解釈方法を表しています。それぞれの場合において、関数は、関数 subsref で返される値 (B) を返さなければなりません。

丸かっこのインデックスの場合

% Handle A(n)
switch S.type
case '()'
   B = A(S.subs{:});
end

中かっこのインデックスの場合

% Handle A{n}
switch S.type
case '{}'
% Determine what this indexing means to your class
% E.g., CellProperty contained a cell array
   B = A.CellProperty{S.subs{:}}; 
end

中かっこは MATLAB のセル配列で使用されますが、subsref メソッドでは、この構文に対する独自の意味で定義できます。

name インデックスの場合、プロパティ値にアクセスします。メソッドの呼び出しは、引数がある場合、インデックス付けの 2 つ目のレベルが必要です。名前は、任意の文字列になることができます。ユーザーは、以下のように name として任意の処理をできます。

switch S.type
case '.'
   switch S.subs
   case 'name1'
      B = A.name1;
   case 'name2'
      B = A.name2;
   end
end

subsref の例

以下のリンクは、subsref メソッドを実装するクラスの例を示します。

変更したインデックスをもつクラス

プロパティをもつ組み込み型のサブクラス

ハードウェアを表すクラス

DocPolynom の subsref メソッド

さらに、「サイズと numel の理解」も参照してください。

Access 属性のオーバーライドの回避

subsref はクラス メソッドなので、プライベートなクラス メンバーへのアクセスをもちます。さまざまなタイプの参照を取り扱うときには、プライベート メソッドやプライベート プロパティに不注意でアクセスすることは避けてください。プライベート プロパティ xy をもつクラスに対して定義されたこの subsref メソッドを考えます。

classdef MyPlot
   properties (Access = private)
      x
      y
   end
   properties
      Maximum
      Minimum
      Average
   end
   methods 
      function obj = MyPlot(x,y)
         obj.x = x;
         obj.y = y;
         obj.Maximum = max(y);
         obj.Minimum = min(y);
         obj.Average = mean(y);
      end
      function B = subsref(A,S)
         switch S(1).type
            case '.'
               switch S(1).subs
                  case 'plot' 
                     % Reference to A.x and A.y call built-in subsref
                     B = plot(A.x,A.y); 
                  otherwise
                     % Enable dot notation for all properties and methods
                     B = A.(S.subs); 
               end
         end
      end
   end
end

この subsref を使用する場合、ユーザーはドット表記を使用して、名前 'plot' を使用して動作 (プロットの作成) を実行できます。次のステートメント

obj = MyPlot(1:10,1:10);
h = obj.plot;

は、関数 plot を呼び出し、graphics オブジェクトへのハンドルを返します。

各メソッドとプロパティ名を明示的にコード化する必要はありません。というのは、内側の switch ブロックの otherwise コードが、case ステートメントで明示的に指定しない名前参照を取り扱うためです。ただし、この手法を使用すると、プライベートなまたはプロテクトされたクラスのメンバーがドット表記で参照可能になります。たとえば、以下のステートメントで、プライベート プロパティ x を参照することができます。

obj.x

ans =

     1     2     3     4     5     6     7     8     9    10

同じ問題は、 プライベートなまたはプロテクトされたプロパティへの割り当てを可能にする、subsasgn メソッドの記述に適用されます。subsrefsubsasgn メソッドは、クラス設計に違反しないように、特定のプロパティとメソッドの名前をそれぞれ明示的にコード化する必要があります。

インデックス付きの割り当てを理解する

オブジェクトのインデックス付きの割り当ては、丸かっこ、中かっこ、name の 3 つの形式です。

A(I) = B
A{I} = B
A.name = B

A のクラスが subsasgn メソッドを実装しないと、これらのステートメントのそれぞれで、MATLAB によりクラス Asubsasgn メソッド、または組み込み関数が呼び出されます。

MATLAB は、subsasgn に 3 つの引数を渡します。

A = subsasgn(A,S,B)

最初の引数 A は、3 つ目の引数 B に値を割り当てるオブジェクトです。

2 つ目の引数 S は、2 つのフィールドをもつ struct 配列です。

  • S.type は、使用されるインデックス タイプを指定する '()', '{}', または '.' を含む文字列です。

  • S.subs は、実際のインデックスまたは名前を含むセル配列または文字列です。インデックスとして使われるコロンは、文字列 ':' としてセル配列に渡されます。コロンを使用して指定される範囲 (例、2:5) は、2 3 4 5 と展開されます。

たとえば、割り当てステートメント

A(2,3) = B;

は、subsasgn への呼び出し、A = subsasgn(A,S,B) を生成します。ここで、S は以下のものです。

S.type = '()'
S.subs = {2,3}

既定の subsasgn は、以下を行います。

  • A のクラスを決めます。BA と同じクラスではない場合、MATLAB は、入力引数として (例、存在する場合は、コンバーター メソッドを呼び出すことで) B を使用してA と同じクラスのオブジェクトを作成しようと試みます。この試みが失敗すると、MATLAB はエラーを返します。

  • AB が同じクラスであったり、あるいは同じクラスにすることができる場合、MATLAB は、行 2、列 3 で配列要素に B の値を割り当てます。

  • 代入ステートメントを実行する前に A が存在しないと、MATLAB は A(2,3) の前にある 5 つの配列要素をクラス AB の既定のオブジェクトで初期化します。たとえば、空の要素は、数値配列の場合 0 に初期化されるか、またはセル配列の場合、空のセル ([]) に初期化されます。MATLAB が空の配列をどのように初期化するかについて、詳細は「空配列の作成」を参照してください。

同様に、式

A{2,3} = B

uses

S.type ='{}'
S.subs = {2,3} % A 2-element cell array containing the numbers 2 and 3

既定の subsasgn は、以下を行います。

  • 2, 列 3 において、cell 配列の要素に B を割り当てます。

  • 代入ステートメントを実行する前に A が存在しないと、MATLAB は、A(2,3) の前にある 5 つのセルを [] で初期化します。結果は、2 行 3 列のセル配列です。

A.Name = B

は、A = subsasgn(A,S,B) を呼び出します。

S.type = '.'
S.subs = 'Name' % The string 'Name'

既定の subsasgn は、以下を行います。

  • struct のフィールド NameB を割り当てます。

  • 代入ステートメントを実行する前に A が存在しないと、MATLAB は、フィールド Name をもつ新規の struct 変数 A を作成し、このフィールド位置に B の値を割り当てます。

  • struct A が存在して、フィールド Name をもたない場合、MATLAB はフィールド Name を追加して、B の値を新規のフィールドの位置に割り当てます。

  • struct A が存在して、フィールド Name をもつ場合、MATLAB は B の値を Name に割り当てます。

ユーザー クラスに対して subsasgn メソッドを実装することで、これらの割り当ての動作のすべてまたはいくつかを再定義できます。

オブジェクトへのインデックス付きの割り当て

A がオブジェクトである場合、式

A.Name = B

は、A = subsasgn(A,S,B) を呼び出します。

S.type = '.'
S.subs = 'Name' % The string 'Name'

既定の subsasgn は、以下を行います。

  • Name プロパティへの B の割り当てを試みます。

  • A のクラスが Name プロパティをもたない場合、MATLAB はエラーを返します。

  • Name プロパティが制限されたアクセス (private または protected) をもつ場合、MATLAB は割り当てが行われるコンテキストに基づいて割り当てが可能かどうかを判定します。

  • A のクラスが、Name プロパティに対する set メソッドを定義する場合、MATLAB は set メソッドを呼び出します。

  • B をプロパティ Name に割り当てるかどうかを決める前に、MATLAB は他の property 属性すべてを適用します。

複雑なインデックス付きの割り当て

これらの簡単な呼び出しは、より複雑なインデックス式で組み合わされます。そのような場合、length(S) はインデックスのレベルの数です。たとえば、

A(1,2).PropertyName(1:4) = B

は、subsasgn(A,S,B) を呼び出します。S は以下の値をもつ 3 x 1 構造体配列です。

S(1).type = '()'    S(2).type = '.'              S(3).type = '()'
S(1).subs = {1,2}   S(2).subs = 'PropertyName'   S(3).subs = {1:4}

subsasgn メソッドの例は、特別の添字付き割り当て — subsasgnを参照してください。

変更したインデックスをもつクラス

この例は、既定のインデックス機能を変更するクラスを定義します。これは、既定のインデックスと特別のインデックスの組み合せを使用します。この例には、完全にロバストなクラスを実装せずに、subsref メソッドおよび subsasgn メソッドを実装するための便利な手法がいくつか示されています。たとえば、horzcatvertcatcatsize、などその他のメソッドを追加せずに配列にオブジェクトを連結することはできません。

インデックス作成および連結の動作を変更するクラスの別の例は、「プロパティをもつ組み込み型のサブクラス」を参照してください。

クラスの説明

クラスには 3 つのプロパティがあります。

  • Data — テストの数値データ

  • Description — テスト データの説明

  • Date — テストが行われた日付

以下のデータ (randi) があるものとします。

d = randi(9,3,4)
d =

     8     9     3     9
     9     6     5     2
     2     1     9     9

クラスのインスタンスを作成します。

obj = MyDataClass(d,'Test001');

コンストラクターの引数は、DataDescription プロパティに値を渡します。clock 関数は、コンストラクター内から Date プロパティに値を割り当てます。この手法では、インスタンスの作成時に時刻と日付の情報がキャプチャされます。

以下は基本となるコードリスニングで、メソッド subsrefsubsasgn がありません。

classdef MyDataClass
   properties
      Data
      Description
   end
   properties (SetAccess = private)
      Date
   end
   methods
      function obj = MyDataClass(data,desc)
         if nargin > 0
            obj.Data = data;
         end
         if nargin > 1
            obj.Description = desc;
         end
         obj.Date = clock; 
      end
   end
end

特定の添字付き参照 — subsref

スカラー オブジェクトのインデックス付き参照の既定の動作を使用します。また、以下のように式で Data プロパティ内にインデックスを作成する機能を追加します。

obj(2,3)

ans =

     5

このステートメントは、以下と等価です。

obj.Data(2,3)

これは、クラスもサポートしています。

ここで説明された '()' インデックス作成を再定義すると、MyDataClass オブジェクトの配列の作成、および個別オブジェクトへのアクセスのための '()' インデックスの作成はできません。スカラー オブジェクトのみを作成します。

設計目標を達成するために、subsref メソッドは、タイプ '.' のインデックスに対して builtin subsref を呼び出し、'()' タイプのインデックスに独自のバージョンを定義します。

function sref = subsref(obj,s)
% obj(i) is equivalent to obj.Data(i)
   switch s(1).type
      % Use the built-in subsref for dot notation
      case '.'
         sref = builtin('subsref',obj,s);
      case '()'
         if length(s)<2
         % Note that obj.Data is passed to subsref
            sref = builtin('subsref',obj.Data,s);
            return
         else
            sref = builtin('subsref',obj,s);
         end
      % No support for indexing using '{}'
      case '{}'
         error('MYDataClass:subsref',...
           'Not a supported subscripted reference')
   end 
end

特別の添字付き割り当て — subsasgn

このクラスは、インデックス付きの割り当てにおいて同じ動作をサポートします。オブジェクトのみを参照して、Data プロパティに値を割り当てられます。

obj(2,3) = 9;

は、以下と等価です。

obj.Data(2,3) = 9;

subsref メソッドのように、subsasgn メソッドは、'.' タイプのインデックスに対して、builtin subsasgn を呼び出し、独自のバージョンの '()' タイプのインデックスを定義します。

別の便利な手法として、substruct 関数をインデックス タイプおよびインデックスの添字 struct の再定義に使用する方法があります。この添字は、MATLAB によって subsref および subsasgn に渡されます。

function obj = subsasgn(obj,s,val)
   if isempty(s) && strcmp(class(val),'MYDataClass')
      obj = MyDataClass(val.Data,val.Description);
   end
   switch s(1).type
   % Use the built-in subsasagn for dot notation
      case '.'
         obj = builtin('subsasgn',obj,s,val);
      case '()'
         if length(s)<2
            if strcmp(class(val),'MYDataClass')
               error('MYDataClass:subsasgn',...
                    'Object must be scalar')
            elseif strcmp(class(val),'double')
            % Redefine the struct s to make the call: obj.Data(i)
               snew = substruct('.','Data','()',s(1).subs(:));
                     obj = subsasgn(obj,snew,val);
            end
         end
      % No support for indexing using '{}'
      case '{}'
         error('MYDataClass:subsasgn',...
            'Not a supported subscripted assignment')
   end     
end

オブジェクト追加の実行 Data — plus

以下のように plus メソッドを実装することによって Data プロパティ データを直接追加できます。

function a = double(obj)
   a = obj.Data;
end
      
function c = plus(obj,b)
   c = double(obj) + double(b);
end

たとえば、以下のようにオブジェクト Data 配列にスカラーを追加します。

% List Current value of Data
obj(:,:) 

ans =

     8     9     3     9
     9     6     5     2
     2     1     9     9

% Add 7 to the array
obj + 7

ans =

    15    16    10    16
    16    13    12     9
     9     8    16    16

MyDataClass double メソッドを使用すると、オブジェクトを double 型の配列に変換できます。MyDataClass オブジェクトは、別のクラスのオブジェクトに追加できます。ただし、その別のクラスに double 型の配列を返す double メソッドを実装していることが必要です。MATLAB は、追加のルールを適用し、次元不一致などのエラーを返します。

オブジェクトに対する end インデックスの定義

A(4:end) のように、オブジェクトのインデックス式で end を使用すると、関数 end は、その次元の最後の要素に相当するインデックスの値を返します。

クラスは、特殊化された動作を実装するクラス メソッドとして関数 end をオーバーロードできます。クラスが end メソッドをを定義する場合、MATLAB は、式の解釈方法を判定するためにそのメソッドを呼び出します。

end には、以下のような呼び出し構文があります。

ind = end(A,k,n)

ここで、

  • A はオブジェクト

  • k は、end 構文を使用した式内のインデックス

  • n は、式内のインデックス総数

  • ind は、式内で使用されるインデックス値

たとえば、次の式を考えます。

A(end-1,:)

MATLAB は、オブジェクト A に定義された end メソッドを引数を使用して呼び出します。

ind = end(A,1,2)

これらの引数は、インデックス要素が 2 つあり、最初のインデックス要素で end ステートメントが発生することを意味します。end クラスのメソッドは、最初の次元の最後の要素に対してインデックス値を返します (この場合は、1 が引かれます)。クラスが end メソッドを実装する場合は、メソッドがそのクラスに対して適切な値を返すようにする必要があります。

MyDataClass の例に対する end メソッド

MyDataClass の例 (「変更したインデックスをもつクラス」を参照) での end メソッドは、Data プロパティの内容に対して作用します。このメソッドの目的は、以下のようなインデックス式において end を置き換えることができる値を返すことです。

obj(4:end)
obj.Data(2,3:end)

などと続きます。

次の関数 end は、end に対して正の整数値を判定して返します。MATLAB は、その値をインデックス式に代入します。

function ind = end(obj,k,n)
   szd = size(obj.Data);
   if k < n
      ind = szd(k);
   else
      ind = prod(szd(k:end));
   end
end

インデックスとしてのオブジェクトの使用

MATLAB は、インデックス付き式内でオブジェクトをインデックスとして使用できます。配列のインデックス化ルールが適用されます。つまり、インデックスは、正の整数である必要があります。したがって、MATLAB は、インデックス付き式内で使用するために、正の整数であるオブジェクトから値を生成できる必要があります。

A がオブジェクトである X(A) のようにインデックス式にすると、この式が X のクラスによって定義済みのオーバーロードされた subsref または subsasgn メソッドにならない限り、MATLAB は、既定の subsindex 関数を呼び出します。「オブジェクトをインデックスとして実装するためのシナリオ」を参照してください。

subsindex は、0 から prod(size(X))-1) までの範囲の整数のインデックス値として、オブジェクトの値を返す必要があります。

オブジェクトをインデックスとして実装するためのシナリオ

X(A) のように、あるオブジェクトを別のオブジェクトによってインデックス化できるようにする場合、この動作は以下のようなさまざまな方法で実装できます。

  • A を整数に変換する A のクラス内の subsindex メソッドを定義します。MATLAB によって Asubsindex メソッドが呼び出され、既定のインデックス化操作が実行されます (X のクラスが、既定の subsref メソッドまたは subsasgn メソッドをオーバーロードしない場合)。

  • X のクラスが subsref メソッドまたは subsasgn メソッドをオーバーロードする場合、これらのメソッドは明示的に Asubsindex メソッドを呼び出せます。この場合、A が、プログラム内の適切なエラー検出を使用して subsindex メソッドを実装するようにする必要があります。

  • X のクラスが subsref メソッドまたは subsasgn メソッドをオーバーロードする場合、これらのメソッドには、subsindex メソッドを実装するための A のクラスに依存しない整数のインデックス値を決定するコードを含むことができます。

subsindex の実装

MATLAB は、インデックスとして使用されるオブジェクトに対して定義された subsindex メソッドを呼び出します。たとえば、オブジェクト A を使用して、オブジェクト B 内にインデックスを作成するとします。B は、目的に応じて、1 つのオブジェクトまたは配列となります。

C = B(A);

クラス A によって実装された subsindex メソッドは、以下のサンプル コードに示すように、オブジェクトを double 形式に変換し、インデックスとして使用できるようにします。

function ind = subsindex(obj)
% Convert the object a to double format to be used
% as an index in an indexing expression
   ind = double(obj);
end

あるいは、ユーザー クラスは、オブジェクトのプロパティの特定の値に基づいてオブジェクトを表す数値を返す、特別のコンバーター メソッドを実装できます。

function ind = subsindex(obj)
% Return the value of an object property
   ind = obj.ElementPosition;
end

subsindex の値は 0 ベースで、1 ベースではありません。

この情報は役に立ちましたか?