Функция присваивания значений полям
Для присваивания полям заданных значений используется описанная далее функция 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: [ ]
Функция создания структур
Для создания структур используется следующая функция:
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'
Функция возврата имен полей
Следующая функция позволяет вывести имена полей заданной структуры:
fieldnames (S) — возвращает имена полей структуры S в виде массива ячеек (см.
урок 15). Пример:
» fieldnames(man)
ans =
'name'
'surname'
'date'
'height'
'weight'
Функция возврата содержимого полей структуры
В конечном счете работа со структурами сводится к выводу и использованию содержимого полей. Для возврата содержимого поля структуры 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 =
Петр
Применение массивов структур
Массивы структур находят самое широкое применение. Например, они используются для представления цветных изображений. Известно, что цветные изображения формата RGB состоят из массивов интенсивности трех цветов - красного R, зеленого G и синего В. При этом каждый массив содержит данные о координатах точки (они определяются целочисленными индексами массива) и о ее яркости (число от 0 до 1 в формате чисел с плавающей запятой). Чтобы некоторое изображение, например pic, несло данные о цвете всех точек, придется представить изображение массивом структур с полями pic.r, pic.g и pic.b.
Еще более сложные структуры (но, в принципе, вполне очевидные) нужны для разработки баз данных, например о работниках предприятия, службах города, городах страны и т. д. Во всех этих случаях особенно важна возможность доступа к отдельным полям структур и возможность присвоения таким полям уникальных имен.
Может показаться, что этот тип данных имеет малое отношение к математическим возможностям системы MATLAB. Однако надо помнить, что поиск информации в больших базах данных, сортировка этой информации и прочие операции, не говоря уже о сложной обработке массивов изображений, — все это примеры явно математических, хотя и достаточно специфических, операций. Причем операций нередко с многомерными структурами. Возможность MATLAB выполнять подобные операции быстро и эффективно (прежде всего с позиций минимальных затрат памяти) открывает перед этой системой очень большие возможности в этой области — впрочем, пока еще ждущие своей реализации. Уже в MATLAB 6.1 возможен одновременный прямой обмен данными между массивами структур MATLAB и множеством записей разных баз данных благодаря Database ToolBox (см. урок 23).
Проверка имен полей и структур
Выполнение операций с полями и элементами полей выполняется по тем же правилам, что и при работе с обычными массивами. Однако существует ряд функций, осуществляющих специфические для структур операции [
Помимо функций isstruct и isfields вы можете использовать для тестирования массивов структур функцию isа(имя объекта, 'struct') и команду или функцию whos имя объекта. — Примеч. ред.
].
Приведенные ниже функции служат для тестирования имен полей и структур записей:
isfielcKS, 'field') — возвращает логическую 1, если 'field' является именем поля структуры S;
isstruct(S) — возвращает логическую 1, если S — структура, и 0 в ином случае. Их применение на примере структуры man показано ниже:
» isfieldCman.'name')
ans =
1
» isfield(man.'family')
ans =
0
» isstruct(man)
ans =
1
» isstruct(many)
??? Undefined function or variable 'many'.
» isstruct('many')
ans =
0
Создание структур и доступ к их компонентам
Для задания структур на языке 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, если Х=[ ].
Тип данных — структуры
Структуры
относятся к сложным типам данных. В предшествующих версиях 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], где они описаны более подробно.
Удаление полей
Для удаления полей структуры можно использовать следующую функцию:
rmfield(S, 'field') — возвращает структуру S с удаленным полем S.'field';
rmfield(S,FIELDS) — возвращает структуру S с несколькими удаленными полями. Список удаляемых полей FIELDS задается в виде массива символов (строки) или строкового массива ячеек.
Пример:
» rmfield(man(2).'surname')
ans =
name: 'Петр'
date: 1959
height: []
weight: []