Main Content

構造体配列

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

スカラー構造体の作成

最初に、患者に関するデータを格納するフィールドをもつ 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: [3x3 double]

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

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

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

patient.billing = 512.00
patient = struct with fields:
       name: 'John Doe'
    billing: 512
       test: [3x3 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 番目の患者に関するデータをもつ patients に 2 番目の構造体を追加します。また、最初の構造体の 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: [3x3 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 を使用してください。

参考

| |

関連するトピック