34.3.1 Defining Indexing And Indexed Assignment

Last-modified: 2025-03-08 (土) 20:11:53

34.3.1 インデックスとインデックス割り当ての定義

オブジェクトは、 や、あるいは のように、括弧または中括弧を使用してインデックス付けできます 。ただし、このインデックス付けが実際に何を意味するかはプログラマが決めます。多項式の場合、 クラスは多項式のn乗の係数を意味するか、またはnにおける多項式の評価を意味する可能性があります。この添え字付き参照の意味は、メソッドによって決まります。 obj(idx)obj{idx}obj(idx).fieldp(n)subsref

: newval = subsref (val, idx)
idxで指定された添字に従って、valに対して添字付き要素選択操作を実行します。

添え字idxは、フィールド'を持つ構造体配列である必要がありますタイプ' そして 'サブ'. 'の有効な値タイプ' は"()"、、 "{}"およびです"."。'サブ' フィールドは、 ":"またはインデックス値のセル配列になります。

次の例は、行列の最初の2列を抽出する方法を示しています。

val = magic (3)
   ⇒ val = [ 8   1   6
              3   5   7
              4   9   2 ]
idx.type = "()";
idx.subs = {":", 1:2};
subsref (val, idx)
    ⇒ [ 8   1
         3   5
         4   9 ]

これは と書くことと同じであることに注意してくださいval(:, 1:2)。

idxがフィールド'を持つ空の構造体配列の場合タイプ' そして 'サブ' の場合は、valを返します。

キーワードはインデックス割り当て endはsubsref内では使用できません。

See also: subsasgn, substruct.

たとえば、このクラスでは、 でインデックスを付けると"()" 多項式が評価され、 でインデックスを付けるとn番目の係数(n"{}"乗)が返される という規則が使用されています。メソッドのコードは 次のようになります 。subsref

function r = subsref (p, s)
 if (isempty (s))
   error ("@polynomial/subsref: missing index");
 endif
 switch (s(1).type)
   case "()"
     idx = s(1).subs;
     if (numel (idx) != 1)
       error ("@polynomial/subsref: need exactly one index");
     endif
     r = polyval (fliplr (p.poly), idx{1});
   case "{}"
     idx = s(1).subs;
     if (numel (idx) != 1)
       error ("@polynomial/subsref: need exactly one index");
     endif
     if (isnumeric (idx{1}))
       r = p.poly(idx{1}+1);
     else
       r = p.poly(idx{1});
     endif
   case "."
     fld = s.subs;
     if (! strcmp (fld, "poly"))
       error ('@polynomial/subsref: invalid property "%s"', fld);
     endif
     r = p.poly;
   otherwise
     error ("@polynomial/subsref: invalid subscript type");
 endswitch
 if (numel (s) > 1)
   r = subsref (r, s(2:end));
 endif
endfunction

添字による割り当ての同等の機能には、 subsasgnメソッドが使用されます。

: newval = subsasgn (val, idx, rhs)
idxで指定された添字に従って添字代入演算を実行します。

添え字idxは、フィールド'を持つ構造体配列である必要がありますタイプ' そして 'サブ'. 'の有効な値タイプ' は"()"、、 "{}"およびです"."。'サブ' フィールドは、 ":"またはインデックス値のセル配列になります。

次の例は、3 行 3 列の行列の最初の 2 列を 0 に設定する方法を示しています。

val = magic (3);
idx.type = "()";
idx.subs = {":", 1:2};
val = subsasgn (val, idx, 0)
    ⇒  [ 0   0   6
          0   0   7
          0   0   2 ]

これは と書くことと同じであることに注意してくださいval(:, 1:2) = 0。

idxがフィールド'を持つ空の構造体配列の場合タイプ' そして 'サブ' の場合は、rhsを返します。

キーワードはインデックス割り当て end内では使用できません。subsasgn

See also: subsref, substruct, optimize_subsasgn_calls.

: val = optimize_subsasgn_calls ()
: old_val = optimize_subsasgn_calls (new_val)
: old_val = optimize_subsasgn_calls (new_val, "local")
メソッド呼び出しの最適化に関する内部フラグを照会または設定しますsubsasgn。

subsasgntrue の場合、Octave はユーザー定義クラスのメソッド を呼び出すときに冗長なコピーを排除しようとします。

オプションを使用して関数内から呼び出されると"local"、関数とそれが呼び出すサブルーチンに対して変数がローカルに変更されます。関数を終了すると、元の変数値が復元されます。

See also: subsasgn.

subsrefおよびメソッドは常にインデックス チェーン全体を受け取りますが、通常は最初の要素のみを処理することに注意してくださいsubsasgn。チェーンの残り (必要な場合) を処理するのはこれらのメソッドの役割であり、通常はチェーンを または に再度転送しsubsrefますsubsasgn。

endオブジェクトの添え字付き式でキーワードを使用する場合は、endメソッドを定義する必要があります。たとえば、 end多項式クラスのメソッドは次のようになります 。

function r = end (obj, index_pos, num_indices)
 if (num_indices != 1)
   error ("polynomial object may only have one index");
 endif
 r = length (obj.poly) - 1;
endfunction

endこれは、Octave Arrayクラスのキーワードに似た動作をする、 かなり汎用的なメソッドですend。polynomialクラスを使った例は次のようになります。

p = polynomial ([1,2,3,4]);
p{end-1}
 ⇒ 3

オブジェクト自体を添え字付きの式のインデックスとして使用することもでき、これはsubsindex関数によって制御されます。

: idx = subsindex (obj)
オブジェクトをインデックス ベクトルに変換します。

objがクラスコンストラクタで定義されたクラスオブジェクトである 場合、は、このクラスオブジェクトを有効なインデックスベクトルに変換できるオーバーロードメソッドです。 は、クラスのゼロベースの実数ベクトルを返す必要がある subsindexことに注意してください 。たとえば、クラスコンストラクタが subsindex"double"

function obj = myclass (a)
 obj = class (struct ("a", a), "myclass");
endfunction
then the subsindex function
function idx = subsindex (obj)
 idx = double (obj.a) - 1.0;
endfunction

以下のように使用できます

a = myclass (1:4);
b = 1:10;
b(a)
⇒ 1  2  3  4

See also: class, subsref, subsasgn.

最後に、メソッドを提供することで、オブジェクトを範囲のように使用できますcolon。

: r = colon (base, limit)
: r = colon (base, increment, limit)
base、 limit、およびオプションでincrementに対応するコロン式の結果を返します。

この関数は演算子構文 or と同等です。 base : limitbase : increment : limit
See also: linspace.