6.1.3 Creating Structures

Last-modified: 2025-03-21 (金) 21:08:39

6.1.3 構造体の作成

インデックス演算子の他に"."、Octave は動的命名 "(var)"またはstruct関数を使用して構造体を作成することができます。動的命名では、変数の文字列値がフィールド名として使用されます。例:

a = "field2";
x.a = 1;
x.(a) = 2;
x
    ⇒ x =
       {
         a =  1
         field2 =  2
       }

動的インデックスを使用すると、有効な Octave 識別子だけでなく、任意の文字列を使用することもできます (これはMATLABでは機能しないことに注意してください)。

a = "long field with spaces (and funny char$)";
x.a = 1;
x.(a) = 2;
x
    ⇒ x =
       {
         a =  1
         long field with spaces (and funny char$) =  2
       }

この使用法について警告するには、警告 ID をOctave:language-extension有効にできます。warning_ids を参照してください。

より現実的には、文字列を操作するすべての関数を使用して、データ構造に入力される前に正しいフィールド名を構築できます。

names = ["Bill"; "Mary"; "John"];
ages  = [37; 26; 31];
for i = 1:rows (names)
 database.(names(i,:)) = ages(i);
endfor
database
    ⇒ database =
       {
         Bill =  37
         Mary =  26
         John =  31
       }

構造体を作成する 3 番目の方法は、structコマンドです。 struct は引数のペアを受け取ります。ペアの最初の引数は構造体に含めるフィールド名で、2 番目の引数は構造体または構造体配列に含める値を表すスカラーまたはセル配列です。例:

struct ("field1", 1, "field2", 2)
⇒ ans =
     {
       field1 =  1
       field2 =  2
     }

渡される値がstructスカラー配列とセル配列の混合である場合、スカラー引数は展開され、一貫した次元を持つ構造体配列が作成されます。例:

s = struct ("field1", {1, "one"}, "field2", {2, "two"},
       "field3", 3);
s.field1
    ⇒
       ans =  1
       ans = one
s.field2
    ⇒
       ans =  2
       ans = two
s.field3
    ⇒
       ans =  3
       ans =  3

セル配列を個別のフィールドとして含む構造体を作成する場合は、次の例に示すように、それを別のセル配列でラップする必要があります。

struct ("field1", {{1, "one"}}, "field2", 2)
    ⇒ ans =
       {
         field1 =
       {
         [1,1] =  1
         [1,2] = one
       }
         field2 =  2
       }

: s = struct ()

: s = struct (field1, value1, field2, value2, …)

: s = struct (obj)

スカラーまたは配列構造を作成し、その値を初期化します。

field1 、field2、… 変数はフィールドの名前を指定する文字列であり、value1 、 value2 、 … 変数は任意の型にすることができます。

値がセル配列の場合は、構造体配列を作成し、その値を初期化します。値の各セル配列の次元は一致している必要があります。単一セルと非セル値は、配列全体を埋めるように繰り返されます。セルが空の場合は、指定されたフィールド名を持つ空の構造体配列を作成します。

引数がオブジェクトの場合、基になる構造体を返します。

構文が構造体配列用に最適化されていることに注意してください。次の例を検討してください。

struct ("foo", 1)
 ⇒ scalar structure containing the fields:
   foo =  1
struct ("foo", {})
 ⇒ 0x0 struct array containing the fields:
   foo
struct ("foo", { {} })
 ⇒ scalar structure containing the fields:
   foo = {}(0x0)
struct ("foo", {1, 2, 3})
 ⇒ 1x3 struct array containing the fields:
   foo

最初のケースは通常のスカラー構造体で、フィールドが 1 つ、値が 1 つです。2 番目のケースでは、構造体配列値の空のセル配列が渡されるため、フィールドが 1 つあり値のない空の構造体配列が生成されます。値が単一のエントリを含むセル配列の場合、これはその単一のエントリをフィールドの値として持つスカラー構造体になります。その単一のエントリは空のセル配列です。

最後に、値が非スカラー セル配列の場合、struct 構造体配列を生成します。

See also: cell2struct, fieldnames, getfield, setfield, rmfield, isfield, orderfields, isstruct, structfun.

この関数はisstruct、オブジェクトが構造体か構造体配列かをテストするために使用できます。

: tf = isstruct (x)

Return true if x is a structure or a structure array.

See also: ismatrix, iscell, isa.