GNU Octave 2.1.x 日本語マニュアル/データ構造体
6 データ構造体
[編集]Octave は,データを構造体にまとめる機能をもっています。 現在の実装では,連想配列の添え字には文字列しか使用できませんが,文法はC 言語の構造体に似ています。 この章では,Octave でデータ構造体を使用する例を紹介します。 構造体の要素は,どのような変数型でも含めることができます。 たとえば,以下の3 つの式を入力すると,3 つの要素を持つ構造体ができあがります。
- x.a = 1
- x.b = [1, 2; 3, 4]
- x.c = "string"
構造体の値を表示するには,通常の変数と同じように,単に変数名を入力するだけです。
- octave:2> x
- x =
- {
- a = 1
- b =
- 1 2
- 3 4
- c = string
- }
Octave では,要素が任意の順序で表示されることに注意してください。 構造体はコピーすることができます。
- octave:1> y = x
- y =
- {
- a = 1
- b =
- 1 2
- 3 4
- c = string
- }
構造体はそれ自体が値なので,構造体の要素として他の構造体を参照することもできます。 以下の例では,構造体x の要素b の値を,構造体に変更しています。
- octave:1> x.b.d = 3
- x.b.d = 3
- octave:2> x.b
- ans =
- {
- d = 3
- }
- octave:3> x
- x =
- {
- a = 1
- b =
- {
- d = 3
- }
- c = string
- }
Octave が,他の構造体を含む構造体の値を表示するときには,ある深さまでしか表示されないことに注意してください。 以下に例を示します。
- octave:1> a.b.c.d.e = 1;
- octave:2> a
- a =
- {
- b =
- {
- c =
- {
- d: 1x1 struct
- }
- }
- }
これは,深く入れ子になった構造体を出力するに当たり,長くなったり混乱したりしないようにするためのものです。
struct_levels_to_print
[編集][Built-in Variable]
struct_levels_to_printに値を設定することにより,Octaveが,どの深さまで構造体を表示するかを指定できます。 標準状態は2です。 関数は,構造体を返すことができます。 たとえば,以下の関数は,行列の実部と虚部を分離して,同じ構造体変数の2つの部分に格納します。
- octave:1> function y = f (x)
- > y.re = real (x);
- > y.im = imag (x);
- > endfunction
この関数に複素数を渡して呼び出すと,fはもとの引数の実部と虚部を含むデータ構造体を返し ます。
- octave:2> f (rand (2) + rand (2) * I);
- ans =
- {
- im =
- 0.26475 0.14828
- 0.18436 0.83669
- re =
- 0.040239 0.242160
- 0.238081 0.402523
- }
関数が返した値のリストは,構造体の要素を含むことになります。 また,それらは任意の他の変数のように添え字をつけることもできます。 以下の例を参照してください。
- octave:1> [ x.u, x.s(2:3,2:3), x.v ] = svd ([1, 2; 3, 4])
- x.u =
- -0.40455 -0.91451
- -0.91451 0.40455
- x.s =
- 0.00000 0.00000 0.00000
- 0.00000 5.46499 0.00000
- 0.00000 0.00000 0.36597
- x.v =
- -0.57605 0.81742
- -0.81742 -0.57605
forステートメントの特別な形式をとることにより,ループの中で,構造体の全ての要素を通して処理することも可能です (Section 12.5 [The for Statement]を参照してください)。 以下の関数を使用することにより,構造体についての情報を得ることができます。
isstruct (expr)
[編集][Built-in Function]
式expr が構造体であれば1 を返します。
fieldnames (struct)
[編集][Built-in Function]
構造体struct の要素に名付けられた文字列の,セル配列を返します。 引数に構造体を渡さずにfieldnamesを呼び出したときは,エラーとなります。
isfield (expr, name)
[編集][Built-in Function]
式expr が構造体であり,name という名前の要素を含むときに1 を返します。 最初の引数は構造体,2 番目の引数は文字列でなければなりません。