Main Content

関数呼び出しの結果へのインデックス付け

このトピックでは、関数呼び出しによって作成された一時変数にドット インデックスを付ける方法を説明します。"一時変数" は、関数呼び出しの結果が、大きな式で中間変数として使用される場合に作成されます。式内の関数呼び出しの結果が一時的であるのは、そこで作成される変数が短期間のみ存在し、実行後は MATLAB® ワークスペースに保存されないためです。例としては、式 myFunction(x).prop があります。これは、引数 x を指定して myFunction を呼び出した後、結果の prop プロパティを返します。任意のタイプの関数 (無名関数、ローカル関数、入れ子関数、またはプライベート関数) をこの方法で呼び出すことができます。

以下の関数を想定します。

function y = myStruct(x)
  y = struct("Afield",x);
end

この関数は、Afield という名前のフィールドを 1 つもつ構造体を作成し、そのフィールドに値を代入します。次のコマンドを使ってこの関数を呼び出し、値 1 を含むフィールドをもつ構造体を作成できます。

myStruct(1)
ans = 

  struct with fields:

    Afield: 1

しかし、フィールド値を直接返す場合は、次のコマンドを使って関数呼び出しの結果にインデックスを付けることができます。

myStruct(1).Afield
ans =

     1

このコマンドの実行後、コマンド myStruct(1) によって作成された一時構造体は存在しなくなり、MATLAB はフィールド値のみを返します。概念的にこの使用法は、構造体を作成し、インデックスを付け、その後削除することと同じです。

S = struct("Afield",1);
S.Afield
clear S

サポートされる構文

MATLAB は、foo(arg).prop のような、関数呼び出しの結果に対するドット インデックスをサポートしています。関数呼び出しの結果に対する他の形式のインデックス付け (小かっこを使用した foo(arg)(2) や、中かっこを使用した foo(arg){2} など) はサポートされていません。コマンドが成功するには、以下の条件を満たしていなければなりません。

  • foo(arg1,arg2,...) のように、小かっこを使用して関数が呼び出されている。

  • 関数は、ドット インデックスが定義されている変数 (構造体、table、オブジェクトなど) を返す。

  • ドット インデックスの添字が有効である。

MATLAB は、ドット インデックスの定義されていない変数が関数から返される場合でも、常に一時変数にドット インデックス演算を適用しようとします。たとえば、magic(3) で作成された行列にインデックスを付けようとすると、エラーが返されます。

magic(3).field
Dot indexing is not supported for variables of this type.

一時変数に対するインデックス付けが引き続き可能であるなら、インデックス付けのコマンドを式の最後にさらに追加することができます。たとえば、次の式を考えます。

table(rand(10,2)).Var1(3,:)
この式では、table にインデックスを付けてそれに含まれる行列を取得し、次にその行列にインデックスを付けて 3 行目を取得します。

  • table(rand(10,2)) は、Var1 という名前の変数を 1 つもつ table を作成する。変数には 10 行 2 列の行列が含まれます。

  • table(rand(10,2)).Var1Var1 に含まれる 10 行 2 列の行列を返す。

  • table(rand(10,2)).Var1(3,:)Var1 に含まれる行列の 3 行目を返す。

参考

|

関連するトピック