Функция присваивания значений полям
Функция присваивания значений полям
Для присваивания полям заданных значений используется описанная далее функция selfield:
setfielcKS. 'field' ,V) — возвращает структуру S с присвоением полю 'field' значения V, что эквивалентно S.field=V;
setfie1d(S,{i .j}, 'field
1
,{k},V) - эквивалентно S(i ,j).field(k)=V.
Функция создания структур
Функция создания структур
Для создания структур используется следующая функция:
struct('fieldl' .VALUES1, 'field2' .VALUES2,...) — возвращает созданную данной функцией структуру, содержащую указанные в параметрах поля 'fieldn' с их значениями ' VALUESn'. Значением может быть массив ячеек;
struct(OBJ) — конвертирует объект OBJ в эквивалентную структуру или массив структур. OBJ может быть объектом или массивом Java.
Функция возврата имен полей
Функция возврата имен полей
Следующая функция позволяет вывести имена полей заданной структуры:
fieldnames (S) — возвращает имена полей структуры S в виде массива ячеек (см.
урок 15).
Функция возврата содержимого полей структуры
Функция возврата содержимого полей структуры
В конечном счете работа со структурами сводится к выводу и использованию содержимого полей. Для возврата содержимого поля структуры S служит функция getfield:
getfield(S, 'field') — возвращает содержимое поля структуры S, что эквивалентно S. field;
getfield(S.{i,j}, 'field', {k}) - 'эквивалентно F=S(i J).field(k).
в командном режиме нельзя вводить
Примечание
Как уже отмечалось, в 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, если Х=[ ].
Применение массивов структур
Применение массивов структур
Массивы структур находят самое широкое применение. Например, они используются для представления цветных изображений. Известно, что цветные изображения формата RGB состоят из массивов интенсивности трех цветов - красного R, зеленого G и синего В. При этом каждый массив содержит данные о координатах точки (они определяются целочисленными индексами массива) и о ее яркости (число от 0 до 1 в формате чисел с плавающей запятой). Чтобы некоторое изображение, например pic, несло данные о цвете всех точек, придется представить изображение массивом структур с полями pic.r, pic.g и pic.b.
Еще более сложные структуры (но, в принципе, вполне очевидные) нужны для разработки баз данных, например о работниках предприятия, службах города, городах страны и т. д. Во всех этих случаях особенно важна возможность доступа к отдельным полям структур и возможность присвоения таким полям уникальных имен.
Может показаться, что этот тип данных имеет малое отношение к математическим возможностям системы MATLAB. Однако надо помнить, что поиск информации в больших базах данных, сортировка этой информации и прочие операции, не говоря уже о сложной обработке массивов изображений, — все это примеры явно математических, хотя и достаточно специфических, операций. Причем операций нередко с многомерными структурами. Возможность MATLAB выполнять подобные операции быстро и эффективно (прежде всего с позиций минимальных затрат памяти) открывает перед этой системой очень большие возможности в этой области — впрочем, пока еще ждущие своей реализации. Уже в MATLAB 6.1 возможен одновременный прямой обмен данными между массивами структур MATLAB и множеством записей разных баз данных благодаря Database ToolBox (см. урок 23).
Пример student: 'Иванов'
Пример 1
» S=struct('student'.'Иванов'.'group'.2.'estimate','good')
S =
student: 'Иванов'
group: 2
estimate: 'good'
Пример » fieldnames(man)
Пример 1
» fieldnames(man)
ans =
'name'
'surname'
'date'
'height'
'weight'
Пример » getfield(man(2),'name')
Пример 1
» getfield(man(2),'name')
ans =
Петр
Пример » setfield(man(2).
Пример 1
» setfield(man(2).'name'.'Николай')
ans =
name: 'Николай'
surname: 'Сидоров'
date: 1959
height: [ ]
weight: [ ]
Пример » rmfield(man(2).'surname')
Пример 1
» rmfield(man(2).'surname')
ans =
name: 'Петр'
date: 1959
height: []
weight: []
Проверка имен полей и структур
Проверка имен полей и структур
Выполнение операций с полями и элементами полей выполняется по тем же правилам, что и при работе с обычными массивами. Однако существует ряд функций, осуществляющих специфические для структур операции [ Помимо функций 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 они именовались записями, что приводило к конфликтам в терминологии 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 задается в виде массива символов (строки) или строкового массива ячеек.
Массивы структур
Урок 14. Массивы структур Тип данных - структуры Создание структур и доступ к их компонентам Функция создания структур Проверка имен полей и структур Функция возврата имен полей Функция возврата содержимого полей структуры Функция присваивания значений полям Удаление полей Применение массивов структур Что нового мы узнали?