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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



Тип данных «Структуры»

Структура записей

Структуры относятся к сложным типам данных. В предшествующих версиях MATLAB они именовались записями, что приводило к неточностям в терминологии системы MATLAB и баз данных. После того как в MATLAB были включены средства создания баз данных, этот тип данных стал именоваться структурами (structures). Они могут содержать разнородные данные, относящиеся к некоторому именованному объекту. Например, объект man (человек) может характеризоваться следующими данными:

 

 

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

MATLAB поддерживает и массивы структур, что позволяет создавать мощные базы данных.

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

 

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

Для задания структур на языке 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 =

>> man.date=1964

>> man =

name: 'Иван'

surname: 'Петров'

date: 1964

height: 170.5000

weight: 70.3400

 

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

>> man(2).name='Петр';

>> man(2).surname='Сидоров';

>> man(2).date=1959;

>> man(2)

ans =

name: 'Петр'

surname: 'Сидоров'

date: 1959

height: [ ]

weight: [ ]

>> man(2).surname

ans =

Сидоров

>> length(man)

ans =

 

Обратите внимание на то, что не все поля данной структуры заполнены. По-этому значением двух последних компонентов структуры 2 оказываются пустые массивы. Число структур позволяет найти функция length (см. последний при мер).

 

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

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

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

Пример:

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

S =

student: 'Иванов'

grup: 2

estimate: 'good'

 

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

Выполнение операций с полями и элементами полей выполняется по тем же правилам, что и при работе с обычными массивами. Однако существует ряд функций, осуществляющих специфические для структур операции.

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

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

isstruct(S) возвращает логическую 1, если S – структура, и 0 в ином случае.

Их применение на примере структуры man показано ниже:

>> isfield(man,'name')

ans = 1

>> isfield(man,'family')

ans = 0

>> isstruct(man)

ans = 1

>> isstruct(many)

??? Undefined function or variable 'many'.

>> isstruct('many')

ans = 0

 

Функции полей структур

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

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

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

>> 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 = Петр

 

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

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

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

Пример:

>> setfield(man(2),'name','Николай')

ans =

name: 'Николай'

surname: 'Сидоров'

date: 1959

height: [ ]

weight: [ ]

 

 

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

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

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

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

Пример:

>> rmfield(man(2),'surname')

ans =

name: 'Петр'

date: 1959

height: []

weight: []

 

Массивы ячеек

Создание массивов ячеек

Массив ячеек – наиболее сложный тип данных в системе MATLAB. Это массив, элементами которого являются ячейки, содержащие любые типы массивов, включая массивы ячеек. Отличительным атрибутом массивов ячеек является задание содержимого последних в фигурных скобках {}. Создавать массивы ячеек можно с помощью оператора присваивания.

Существуют два способа присваивания данных отдельным ячейкам:

индексацией ячеек;

индексацией содержимого.

Рассмотрим первый способ. Для этого создадим файл-сценарий с именем ce.m:

A(1,1)={'Курить вредно!'};

A(1,2)={[1 2;3 4]};

A(2,1)={2+3i};

A(2,2)={0:0.1:1}

 

В этом примере задан массив ячеек с четырьмя элементами: строкой символов, матрицей, комплексным числом и одномерным массивом из 11 чисел. Теперь можно вызвать этот массив:

>> ce

A =

'Курить вредно!' [2x2 double]

[2.0000+ 3.0000i] [1x11 double]

>> A(1,1)

ans =

'Курить вредно!'

>> A(2,1)

ans = [2.0000+ 3.0000i]

 

Заметим, что к ячейкам такого массива можно обращаться с помощью индексирования, например в виде A(1,1), A(2,1) и т. д.

При индексации содержимого массив ячеек задается следующим образом:

A{1,1}='Курить вредно!';

A{1,2}=[1 2;3 4];

A{2,1}=2+3i;

A{2,2}=0:0.1:1;

Теперь можно ознакомиться с созданным массивом ячеек в командном режиме:

>> A

ans =

'Курить вредно!' [2x2 double]

[2.0000+ 3.0000i] [1x11 double]

>> A{1,1}

ans = Курить вредно!

>> A{2,1}

ans = 2.0000 + 3.0000i

При серьезной работе с массивами структур (записей) и массивами ячеек полезно иметь дополнительную информацию о списках значений. Для получения такой информации следует выполнить команду help list.

Визуализация массивов ячеек

Для отображения массива ячеек C служит команда celldisp(C). Она дает рекурсивное отображение содержимого массива ячеек C. Например, для ранее созданного массива ячеек A получится следующее:

>> celldisp(A)

A{1,1} = Курить вредно!

A{2,1} = 2.0000 + 3.0000i

A{1,2} =

1 2

3 4

A{2,2} =

Columns 1 through 7

0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000

Columns 8 through 11

0.7000 0.8000 0.9000 1.0000

Для более наглядного графического представления массива ячеек может использоваться команда cellplot:

cellplot(C) строит структуру массива ячеек C;

cellplot(C,'legend') строит структуру массива ячеек C вместе с «легендой» – шкалой стилей представления данных;

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

 

Рис. 1. Графическое представление массива с четырьмя ячейками

Многомерные массивы ячеек

Вложенные массивы ячеек

Содержимым ячейки массива ячеек может быть, в свою очередь, произвольный массив ячеек. Таким образом, возможно создание вложенных массивов ячеек – пожалуй, самого сложного типа данных. В следующем примере показано формирование массива ячеек A с вложенным в него массивом B (он был создан в примере выше):

>> clear A;

>> A(1,1)={{magic(3),{'Hello!'}}};

>> A(1,2)={B};

>> A

ans = {1x2 cell} {2x2 cell}

>> A{1}

ans = [3x3 double] {1x1 cell}

>> A{2}

ans =

'Пить тоже вредно!' [1x4 double]

[ 2] [ 6.2832]

>> cellplot(A)

На рис. 3 показано отображение массива A с вложенным в него массивом B.

В данном случае вложенный массив отображается полностью как часть массива A.

 

Рис. 3. Графическое представление массива с вложенным в него другим массивом

Урок 6

Тип данных «Структуры»

Структура записей

Структуры относятся к сложным типам данных. В предшествующих версиях MATLAB они именовались записями, что приводило к неточностям в терминологии системы MATLAB и баз данных. После того как в MATLAB были включены средства создания баз данных, этот тип данных стал именоваться структурами (structures). Они могут содержать разнородные данные, относящиеся к некоторому именованному объекту. Например, объект man (человек) может характеризоваться следующими данными:

 

 

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

MATLAB поддерживает и массивы структур, что позволяет создавать мощные базы данных.

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

 

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

Для задания структур на языке 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 =

>> man.date=1964

>> man =

name: 'Иван'

surname: 'Петров'

date: 1964

height: 170.5000

weight: 70.3400

 

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

>> man(2).name='Петр';

>> man(2).surname='Сидоров';

>> man(2).date=1959;

>> man(2)

ans =

name: 'Петр'

surname: 'Сидоров'

date: 1959

height: [ ]

weight: [ ]

>> man(2).surname

ans =

Сидоров

>> length(man)

ans =

 

Обратите внимание на то, что не все поля данной структуры заполнены. По-этому значением двух последних компонентов структуры 2 оказываются пустые массивы. Число структур позволяет найти функция length (см. последний при мер).

 

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

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

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

Пример:

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

S =

student: 'Иванов'

grup: 2

estimate: 'good'

 



Поделиться:


Последнее изменение этой страницы: 2016-04-23; просмотров: 1464; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.23.123 (0.08 с.)