Массивы структур

Когда у вас есть данные, которые вы хотите организовать по наименованию, можно использовать структуры, чтобы сохранить их. Структуры хранят данные в названных полях контейнеров, к которым можно затем получить доступ именами, которые вы задаете. Используйте запись через точку, чтобы создать, присвоить, и получить доступ к данным в полях структуры. Если значение, сохраненное в поле, является массивом, то можно использовать индексацию массива, чтобы получить доступ к элементам массива. Когда вы храните несколько структур как массив структур, можно использовать индексацию массива и запись через точку, чтобы получить доступ к отдельным структурам и их полям.

Создайте скалярную структуру

Во-первых, создайте структуру под названием patient это имеет поля, хранящие данные о пациенте. Схема показывает, как структура хранит данные. Структура как patient также упоминается как скалярная структура, потому что переменная хранит одну структуру.

Используйте запись через точку, чтобы добавить поля 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)

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

К части доступа массива, сохраненного в поле, добавьте индексы, которые подходят для размера и типа массива. Например, создайте столбчатую диаграмму данных в одном столбце patient.test.

bar(patient.test(:,1))

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

Индексируйте в нескалярный массив структур

Массивы структур могут быть нескалярными. Можно создать массив структур, имеющий любой размер, пока каждая структура в массиве имеет те же поля.

Например, добавьте вторую структуру в patients наличие данных о втором пациенте. Кроме того, присвойте исходное значение 127 к billing поле первой структуры. Поскольку массив теперь имеет две структуры, необходимо получить доступ к первой структуре путем индексации, как в 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. Массив структур иногда упоминается как массив структур. Однако термины массив структур и массив структур означают то же самое. Как другие массивы MATLAB®, массив структур может иметь любые размерности.

Массив структур имеет следующие свойства:

  • Все структуры в массиве имеют то же количество полей.

  • Все структуры имеют те же имена полей.

  • Поля того же имени в отличных структурах могут содержать различные типы или размеры данных.

Если вы добавляете новую структуру в массив, не задавая все его поля, то незаданные поля содержат пустые массивы.

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

Чтобы индексировать в массив структур, используйте индексацию массива. Например, patient(2) возвращает вторую структуру.

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

Чтобы получить доступ к полю, используйте индексацию массива и запись через точку. Например, возвратите значение billing поле для второго пациента.

patient(2).billing
ans = 28.5000

Также можно индексировать в массив, сохраненный полем. Создайте столбчатую диаграмму, отображающую только первые два столбца patient(2).test.

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

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

Примечание

Можно индексировать в часть поля только, когда вы обращаетесь к одному элементу массива структур. MATLAB® не поддерживает операторы, такие как patient(1:2).test(1:2,2:3), которые пытаются индексировать в поле для нескольких элементов массива структур. Вместо этого используйте arrayfun функция.

Смотрите также

| |

Похожие темы