Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Обращение к полям структуры с применением функций setfield и getfield



Прямая индексация обычно является наиболее эффективным способом задания или получе-ния значений полей структуры. Если, однако, вы знаете только название поля в виде строки, например, если вы использовали функцию fieldnames для получения имени поля в пределах M-файла – то для указанных операций с данными этих полей можно также применить функ-ции setfield и getfield.

Функция getfield позволяет получить значение или значения поля или элемента поля и име-ет следующий синтаксис

 

f = getfield(array,{array_index},'field',{field_index})

 

где индекс field_index является необязательным , а array_index является необязательным для массива структур размера 1х1. Данный синтаксис соответствует записи

 

f = array(array_index).field(field_index)

 

Например, для обращения к полю name во второй структуре массива patientзапишем

 

str = getfield(patient,{2},'name')

 

Аналогично, функция setfield дает возможность задать значения полей используя синтаксис

 

f = setfield (array,{array_index},'field',{field_index},value)

 

Определение размера массива структур

Для получения размера массива структур или размера любого поля структуры. можно вос-пользоваться функцией size. При вводе в качестве аргумента функции size имени структуры, данная функция возвращает вектор размерностей массива. Если задать аргумент в форме массив(n).поле, функция sizeвозвращает размер содержимого поля. Например, для нашей структуры patientразмера 1х3, запись size(patient) возвращает вектор [1 3]. Выражение size(patient(1,2).name) возвращает длину строки имени элемента (1,2) структуры patient.

Добавление полей к структуре

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

 

patient(2).ssn = '000–00–0000'

При этом поле patient(2).ssn второго пациекта имеет заданное значение. Все другие структу-ры в массиве структур также имеют поле ssn, но эти поля содержат пустые матрицы до тех пор, пока вы не зададите в явном виде соответствующие значения.

 

Удаление поля из структуры

Вы можете удалить любое поле заданной структуры при помощи функции rmfield. Ее наиболее общая форма имеет вид

 

struc2 = rmfield(array,'field')

где arrayэто массив структур, а 'field' является именем поля, которое вы хотите удалить. Например, чтобы удалить поле name из массива patient, нужно ввести:

 

patient = rmfield(patient,'name')

Применение функций и операторов

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

 

Mean((patient(2).test)')

Зачастую бывают различные возможности для применеия функций или операторов к полям массива структур. Один из путей суммирования всех полей billing в структуреpatientвыг-лядит следующим образом:

 

total = 0;

for j = 1:length(patient)

total = total + patient(j).billing;

End

Для упрощения подобных операций, MATLAB предоставляет возможность производить дей-ствия одновременно со всеми одноименными полями массива структур. Для этого нужно просто заключить выражение (допустим, array.field)в квадратные скобки внутриприменяе-мой функции. Например, вы можете решить приведенную выше задачу, записав

total = sum ([patient.billing])

Подобная запись эквивалентна использованию так называемого списка, разделенного запятой (comma-separated list)

 

total = sum ([patient(1).billing , patient(2).billing ,...])

 

Такой синтаксис наиболее полезен в случаях, когда поле является скалярным операндом.

 

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

Вы можете записать свои функции в виде М-файлов для работы со структурами любой нес-тандартной формы. При этом вам придется осуществить собственный контроль ошибок. Иными словами, вам следует убедиться, что осуществляется проверка действий над выбран-ными полями.

В качестве примера, рассмотрим набор данных, который описывает измерения в различных моментах времени различных токсинов в источнике питьевой воды. Данные состоят из 15 различных наблюдений, где каждое наблюдение содержит три независимых замера. Вы мо-жете организовать эти данные в виде набора 15 структур, где каждая структура имеет три поля, по одному для каждого проведенного измерения.

Приведенная ниже функция concen, действует над массивом структур со специфичными ха-рактеристиками. Их характеристики должны содержать поля lead(свинец), mercury(ртуть),

иchromium(хром).

 

function [r1, r2] = concen(toxtest);

% Create two vectors. r1 contains the ratio of mercury to lead

% at each observation. r2 contains the ratio of lead to chromium.

r1 = [toxtest.mercury]./[toxtest.lead];

r2 = [toxtest.lead]./[toxtest.chromium];

% Plot the concentrations of lead, mercury, and chromium

% on the same plot, using different colors for each.

lead = [toxtest.lead];

mercury = [toxtest.mercury];

chromium = [toxtest.chromium];

Plot(lead,'r'); hold on

Plot(mercury,'b')

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.