構造体配列
名前で整理するデータがある場合、構造体を使用してデータを格納できます。構造体は "フィールド" というコンテナーにデータを格納するため、指定した名前でアクセスできます。構造体フィールドでデータを作成、割り当て、アクセスするにはドット表記を使用します。フィールドに格納されている値が配列の場合、配列インデックス付けを使用して配列の要素にアクセスできます。複数の構造体を構造体配列として格納するときは、配列インデックス付けとドット表記を使用して、個々の構造体とそのフィールドにアクセスできます。
スカラー構造体の作成
最初に、患者に関するデータを格納するフィールドをもつ patient
という構造体を作成します。次の図は、構造体がどのようにデータを格納するかを示しています。patient
のような構造体は、変数が 1 つの構造体を格納するため、"スカラー構造体" とも呼ばれます。
ドット表記を使用してフィールド name
、billing
、および 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)
フィールドに格納されている配列の一部にアクセスするには、配列のサイズと型に合わせて適切なインデックスを追加します。たとえば、patient.test
の 1 つの列にあるデータの棒グラフを作成します。
bar(patient.test(:,1))
非スカラー構造体配列へのインデックス付け
構造体配列は非スカラー値になることがあります。配列内の各構造体のフィールドが同じである限り、任意のサイズの構造体配列を作成できます。
たとえば、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 列の構造体配列です。
配列に格納されている各患者のデータは、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]))
メモ
構造体配列の 1 つの要素を参照する場合にのみ、フィールドの部分にインデックスを付けることができます。MATLAB® では、構造体配列の複数の要素のフィールドにインデックスを付けようと試みるステートメント (たとえば、patient(1:2).test(1:2,2:3)
など) はサポートされません。代わりに、関数 arrayfun
を使用してください。
参考
struct
| fieldnames
| isfield