Урок 14. Массивы структур

1. Урок 14. Массивы структур

 

Урок №14.

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

  • Тип данных — структуры

  • Создание структур и доступ к их компонентам

  • Проверка имен полей и структур 

  • Функция возврата имен полей

  • Функция возврата содержимого полей структуры

  • Функция присваивания значений полям

  • Удаление полей

2. Тип данных - структуры

 

Тип данных — структуры

Структуры относятся к сложным типам данных. В предшествующих версиях MATLAB они именовались записями, что приводило к конфликтам в терминологии MATLAB и систем управления базами данных. Этот тип данных стал именоваться структурами после того, как широкое распространение получили средства MATLAB для работы с базами данных с использованием языка запросов Sequential Query Language (SQL).. Структуры MATLAB и их поля в отличие от полей записей баз данных не являются объектами SQL, но зато обращения к структурам могут быть откомпилированы и к ним возможен прямой доступ, минуя сложные и медленные механизмы систем управления базами данных. Структуры могут содержать разнородные данные, относящиеся к некоторому именованному объекту. Например, объект man (человек) может характеризоваться следующими данными:

Man(i....)


Имя записи

.name

Иван

Имя человека

.surname

Петров

Фамилия

.date

1956

Год рождения

.height

170.5

Рост

.weight

70.34

Вес

Первые два столбца представляют схему структуры. Как нетрудно заметить, каждая i-я структура состоит из ряда полей, имеющих имена, например man(i).name, man(i) .date и т. д. Поля могут содержать данные любого типа — от пустого поля [ ] до массивов. Приведенная выше структура имеет размер 1x1. MATLAB поддерживает и массивы структур, что позволяет создавать мощные базы данных.

Поле структуры может содержать другую вложенную структуру или массив структур. Это позволяет создавать вложенные структуры и даже многомерные массивы структур. Поскольку в данной книге такие структуры не используются, отсылаем заинтересованного читателя к книге [42], где они описаны более подробно.

 

3. Создание структур и доступ к их компонентам

 

Создание структур и доступ к их компонентам

Для задания структур на языке MATLAB можно использовать операторы присваивания, что иллюстрирует следующий пример:

» man.name='Иван';

» man.surname-'Петров': 

» man.date=1956; 

» man.height=170.5;

» man.weight=70.34;

Здесь построена базовая структура без индексного указателя. Теперь можно просмотреть полученную структуру, просто указав ее имя:

» man

man =

name: 'Иван' 

surname: 'Петров' 

date: 1956 

height: 170.5000 

weight: 70.3400

Нетрудно догадаться, что компоненты структуры можно вызывать по имени и менять их значения. При этом имя компонента состоит из имени структуры и имени поля, разделенных точкой. Это поясняют следующие примеры:

» man.date 

ans =

1956

» man.date=1964 

man =

name: 'Иван'

surname: 'Петров'

date: 1964

height: 170.5000

weight: 70.3400

Примечание

Как уже отмечалось, в MATLAB 6.0 существует проблема с записью символов кирилли-цы в командном режиме. Так, в командном режиме нельзя вводить в аргументы структур малую букву «с» русского алфавита — она ведет к переводу строки. Этого ограничения нет при задании структур в программах, хотя и в этом случае ошибки при вводе символов кириллицы не исключены.

Для создания массива структур вводится их индексация. Например, вектор структур можно создать, введя индекс в скобках после имени структуры. Так, для создания новой, второй структуры, можно поступить следующим образом:

»mаn(2).namе='Петр';

»mаn(2).Surnamе='Сидоров';

» man(2).date=1959;

»mаn(2)

ans =

name: 'Петр'

surname: 'Сидоров'

date: 1959

height: [ ]

weight: [ ] 

» man(2).surname 

ans = 

Сидоров 

» length(man)

ans = .2

Обратите внимание на то, что не все поля данной структуры заполнены. Поэтому значением двух последних полей структуры 2 оказываются пустые массивы. Число структур в массиве структур позволяет найти функция length (см. последний пример). Эта же функция может использоваться и для нахождения размера любого вектора или размерности многомерного непустого массива, так как length(Х)= MAX(size(X)), если X — непустой массив, и length(X)=0, если Х=[ ].

 

4. Функция создания структур

 

Функция создания структур

Для создания структур используется следующая функция:

  • struct('fieldl' .VALUES1, 'field2' .VALUES2,...) — возвращает созданную данной функцией структуру, содержащую указанные в параметрах поля 'fieldn' с их значениями ' VALUESn'. Значением может быть массив ячеек;

  • struct(OBJ) — конвертирует объект OBJ в эквивалентную структуру или массив структур. OBJ может быть объектом или массивом Java.

Пример:

» S=struct('student'.'Иванов'.'group'.2.'estimate','good')

 S =

student: 'Иванов'

group: 2

estimate: 'good'

 

5. Проверка имен полей и структур

 

Проверка имен полей и структур

Выполнение операций с полями и элементами полей выполняется по тем же правилам, что и при работе с обычными массивами. Однако существует ряд функций, осуществляющих специфические для структур операции [ Помимо функций isstruct и isfields вы можете использовать для тестирования массивов структур функцию isа(имя объекта, 'struct') и команду или функцию whos имя объекта. — Примеч. ред. ].

Приведенные ниже функции служат для тестирования имен полей и структур записей:

  • isfielcKS, 'field') — возвращает логическую 1, если 'field' является именем поля структуры S;

  • isstruct(S) — возвращает логическую 1, если S — структура, и 0 в ином случае. Их применение на примере структуры man показано ниже:

» isfieldCman.'name') 

ans = 

» isfield(man.'family')

ans =

0

» isstruct(man) 

ans =

1

» isstruct(many)

??? Undefined function or variable 'many'. 

» isstruct('many') 

ans =

0

 

6. Функция возврата имен полей

 

Функция возврата имен полей

Следующая функция позволяет вывести имена полей заданной структуры:

  • fieldnames (S) — возвращает имена полей структуры S в виде массива ячеек (см. урок 15). Пример: 

» fieldnames(man)

ans = 

'name' 

'surname' 

'date' 

'height' 

'weight'

 

7. Функция возврата содержимого полей структуры

 

Функция возврата содержимого полей структуры

В конечном счете работа со структурами сводится к выводу и использованию содержимого полей. Для возврата содержимого поля структуры S служит функция getfield:

  • getfield(S, 'field') — возвращает содержимое поля структуры S, что эквивалентно S. field;

  • getfield(S.{i,j}, 'field', {k}) - 'эквивалентно F=S(i J).field(k). Пример:

» getfield(man(2),'name')

ans =

Петр

 

8. Функция присваивания значений полям

 

Функция присваивания значений полям

Для присваивания полям заданных значений используется описанная далее функция selfield:

  • setfielcKS. 'field' ,V) — возвращает структуру S с присвоением полю 'field' значения V, что эквивалентно S.field=V;

  • setfie1d(S,{i .j}, 'field 1 ,{k},V) - эквивалентно S(i ,j).field(k)=V. Пример:

» setfield(man(2).'name'.'Николай')

 ans =

name: 'Николай'

surname: 'Сидоров'

date: 1959

height: [ ]

weight: [ ]

 

9. Удаление полей

 

Удаление полей

Для удаления полей структуры можно использовать следующую функцию: 

  •  rmfield(S, 'field') — возвращает структуру S с удаленным полем S.'field';

  • rmfield(S,FIELDS) — возвращает структуру S с несколькими удаленными полями. Список удаляемых полей FIELDS задается в виде массива символов (строки) или строкового массива ячеек.

Пример:

» rmfield(man(2).'surname') 

ans =

name: 'Петр'

date: 1959

height: []

weight: []

 

10. Применение массивов структур

 

Применение массивов структур

Массивы структур находят самое широкое применение. Например, они используются для представления цветных изображений. Известно, что цветные изображения формата RGB состоят из массивов интенсивности трех цветов - красного R, зеленого G и синего В. При этом каждый массив содержит данные о координатах точки (они определяются целочисленными индексами массива) и о ее яркости (число от 0 до 1 в формате чисел с плавающей запятой). Чтобы некоторое изображение, например pic, несло данные о цвете всех точек, придется представить изображение массивом структур с полями pic.r, pic.g и pic.b.

Еще более сложные структуры (но, в принципе, вполне очевидные) нужны для разработки баз данных, например о работниках предприятия, службах города, городах страны и т. д. Во всех этих случаях особенно важна возможность доступа к отдельным полям структур и возможность присвоения таким полям уникальных имен.

Может показаться, что этот тип данных имеет малое отношение к математическим возможностям системы MATLAB. Однако надо помнить, что поиск информации в больших базах данных, сортировка этой информации и прочие операции, не говоря уже о сложной обработке массивов изображений, — все это примеры явно математических, хотя и достаточно специфических, операций. Причем операций нередко с многомерными структурами. Возможность MATLAB выполнять подобные операции быстро и эффективно (прежде всего с позиций минимальных затрат памяти) открывает перед этой системой очень большие возможности в этой области — впрочем, пока еще ждущие своей реализации. Уже в MATLAB 6.1 возможен одновременный прямой обмен данными между массивами структур MATLAB и множеством записей разных баз данных благодаря Database ToolBox (см. урок 23).

 

11. Что нового мы узнали?

 

Что нового мы узнали?

В этом уроке мы научились:

  • Создавать структуры.

  • Обеспечивать доступ к полям структур.

  • Проверять имена полей и структур.

  • Использовать функции возврата имен полей и их содержимого.

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