Programming and Data Types | ![]() ![]() |
サブスクリプトを使ったリファレンスの取り扱い
代入ステートメントの右辺側にあるオブジェクトをサブスクリプト、または、フィールド識別子と共に使うことは、サブスクリプトを使ったリファレンス(subscripted
reference)として知られています。MATLABは、このような場合、subsref
と名付けたメソッドを呼びます。オブジェクトのサブスクリプト化されたリファレンスは、3つの型、配列インデックス、セル配列インデックス、構造体フィールド名からなります。
A(I)
A{I}
A.field
これらの各々は、classディレクトリ内のsubsref
fメソッドに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を使用したインデックス付きリファレンス | サブスクリプトを使った代入 | ![]() |