| Programming and Data Types |
サブスクリプトを使ったリファレンスの取り扱い
代入ステートメントの右辺側にあるオブジェクトをサブスクリプト、または、フィールド識別子と共に使うことは、サブスクリプトを使ったリファレンス(subscripted
reference)として知られています。MATLABは、このような場合、subsrefと名付けたメソッドを呼びます。オブジェクトのサブスクリプト化されたリファレンスは、3つの型、配列インデックス、セル配列インデックス、構造体フィールド名からなります。
A(I)A{I}A.field
これらの各々は、classディレクトリ内のsubsreffメソッドにMATLABにより読み込まれます。MATLABは、2つの引数をsubsrefに渡します。
B = subsref(A,S)
最初の引数は、参照されるオブジェクトです。二番目の引数Sは、2つのフィールドをもつ構造体配列です。
S.type は、サブスクリプトタイプを設定する'()',
'{}', '.'いずれかを含む文字列です。括弧は数値配列、中括弧はセル配列、点は構造体配列を表わします。
S.subs
は、実際のサブスクリプトを含んだセル配列、または、文字列です。サブス
クリプトのように使用するコロンは、文字列':'同じように転送されます。A(1:2,:)
は、MATLABにセルsubsref(A,S)を呼び出します。ここで、Sはつぎの要素
S.type = '()'S.subs = {1:2,':'}
A{1:2}
は、つぎのものを使います。
S.type ='{}'S.subs = {1:2}
A.field
S.type = '.'S.subs = 'field'
この簡単な呼び出しを組み合わせて、より複雑なサブスクリプトを使った表現に適用できます。このような場合、length(S)は、サブスクリプトを使ったレベル数です。たとえば、
A(1,2).name(3:4)
は、subsref(A,S)を呼びます。ここで、Sは、つぎの値をもつ3行1列の構造体配列です。
S(1).type = '()' S(2).type = '.' S(3).type = '()'S(1).subs = '{1,2}' S(2).subs = 'name' S(3).subs = '{3:4}'
subsrefの書き方
subsrefメソッドは、MATLABによって渡されるサブスクリプトを使った表現を解釈
します。通常のアプローチは、switchステートメントを使って、使用するインデッ
クス機能のタイプを決定し、実際のインデックスを取得します。つぎの3つの分
割されたコードは、入力引数の解釈法を示しています。各々の場合、関数は、値
Bを出力します。
switch S.type
case '()'
B = A(S.subs{:});
end
セル配列に対して、
switch S.type
case '{}'
B = A(S.subs{:}); % A is a cell array
end
switch S.type
case '.'
switch S.subs
case 'field1'
B = A.field1;
case 'field2'
B = A.field2;
end
end
subsrefメソッドの例題
subsrefメソッドの例題は、つぎの節を参照してください。
| subsrefとsubsasgnを使用したインデックス付きリファレンス | サブスクリプトを使った代入 |