メインコンテンツ

構造体配列

名前で整理するデータがある場合、構造体を使用してデータを格納できます。構造体は "フィールド" というコンテナーにデータを格納するため、指定した名前でアクセスできます。構造体フィールドでデータを作成、割り当て、アクセスするにはドット表記を使用します。フィールドに格納されている値が配列の場合、配列インデックス付けを使用して配列の要素にアクセスできます。複数の構造体を構造体配列として格納するときは、配列インデックス付けとドット表記を使用して、個々の構造体とそのフィールドにアクセスできます。

スカラー構造体の作成

最初に、患者についてのデータを格納するフィールドをもつ patient という名前の構造体を作成します。次の図は、この構造体にデータをどのように格納するかを示したものです。patient のような構造体は、変数に 1 つの構造体を格納することから、"スカラー構造体" とも呼ばれます。

strucdem_01.png

ドット表記を使用してフィールド namebilling、および test を追加し、各フィールドにデータを代入します。この例では、構文 patient.name で構造体とその最初のフィールドの両方が作成されます。それに続くコマンドで他のフィールドを追加しています。

patient.name = 'John Doe';
patient.billing = 127;
patient.test = [79 75 73; 180 178 177.5; 220 210 205]
patient = struct with fields:
       name: 'John Doe'
    billing: 127
       test: [3×3 double]

フィールドの値へのアクセス

フィールドを作成した後も、ドット表記を使用することで、格納された値にアクセスして変更することができます。

たとえば、billing フィールドの値を変更します。

patient.billing = 512.00
patient = struct with fields:
       name: 'John Doe'
    billing: 512
       test: [3×3 double]

ドット表記を使用して、任意のフィールドの値にアクセスすることもできます。たとえば、patient.test の値から棒グラフを作成します。patient.name のテキストを使用してタイトルを追加します。フィールドに配列が格納されている場合、この構文は配列全体を返します。

bar(patient.test)
title("Test Results for " + patient.name)

Figure contains an axes object. The axes object with title Test Results for John Doe contains 3 objects of type bar.

フィールドに格納されている配列の一部にアクセスするには、配列のサイズと型に応じたインデックスを追加します。たとえば、patient.test の 1 つの列のデータから棒グラフを作成します。

bar(patient.test(:,1))

Figure contains an axes object. The axes object contains an object of type bar.

非スカラー構造体配列へのインデックス付け

構造体配列は非スカラーにすることもできます。配列内の各構造体のフィールドが同じであれば、任意のサイズの構造体を作成できます。

たとえば、2 人目の患者に関するデータをもつ 2 番目の構造体を patients に追加します。さらに、最初の構造体の billing フィールドに元の値の 127 を代入します。配列に含まれる構造体が 2 つになったため、最初の構造体にアクセスするには patient(1).billing = 127 のようにインデックスを付ける必要があります。

patient(2).name = 'Ann Lane';
patient(2).billing = 28.50;
patient(2).test = [68 70 68; 118 118 119; 172 170 169];
patient(1).billing = 127
patient=1×2 struct array with fields:
    name
    billing
    test

結果として、patient は次の図のような内容の 1 行 2 列の構造体配列になります。

strucdem_02.png

配列内の各患者のレコードは、クラス struct の構造体です。構造体の配列は "struct 配列" と呼ばれることもあります。ただし、"struct 配列""構造体配列" という用語は同じものを意味します。他の MATLAB® 配列と同様に、構造体配列は任意の次元にすることができます。

構造体配列には次のような性質があります。

  • 配列内のすべての構造体が同じ数のフィールドをもつ。

  • すべての構造体が同じ名前のフィールドをもつ。

  • 同じ名前のフィールドに構造体ごとに異なる型またはサイズのデータを格納できる。

すべてのフィールドを指定せずに配列に新しい構造体を追加すると、未指定のフィールドには空の配列が格納されます。

patient(3).name = 'New Name';
patient(3)
ans = struct with fields:
       name: 'New Name'
    billing: []
       test: []

構造体配列にインデックスを付けるには、配列インデックス付けを使用します。たとえば、patient(2) は 2 番目の構造体を返します。

patient(2)
ans = struct with fields:
       name: 'Ann Lane'
    billing: 28.5000
       test: [3×3 double]

フィールドにアクセスするには、配列インデックス付けとドット表記を使用します。たとえば、2 人目の患者の billing フィールドの値を返します。

patient(2).billing
ans = 
28.5000

フィールドに格納された配列にインデックスを付けることもできます。patient(2).test の最初の 2 列のみを表示する棒グラフを作成します。

bar(patient(2).test(:,[1 2]))

Figure contains an axes object. The axes object contains 2 objects of type bar.

メモ

構造体配列の 1 つの要素を参照する場合にのみ、フィールドの部分にインデックスを付けることができます。MATLAB® では、構造体配列の複数の要素のフィールドにインデックスを付けようと試みるステートメント (たとえば、patient(1:2).test(1:2,2:3) など) はサポートされません。代わりに、関数 arrayfun を使用してください。

参考

| |

トピック