Рефераты. Система математических расчетов MATLAB

Обращение к данным в массивах структур.

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

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

mypatients = patient(1:2)

1x2 struct array with fields:

name

billing

test

Первая структура в массиве mypatients совпадает с первой структурой в массиве patient:

mypatients(1)

ans =

name: 'John Doe'

billing: 127

test: [3x3 double].

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

str = patient(2) . name

str =

Ann Lane

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

test2b = patient(3).test(2,2)

test2b =

153

Аналогичную форму записи следует использовать и для задания значений переменных внутри поля, например,

patient(3).test(2,2) = 7

Вы можете также одновременно извлечь данные одноименных полей многомерной структу-ры. Например, запись ниже создает вектор 1х3, содержащий все значения счетов полей billing fields.

bills = [patient.billing]

bills =

127.0000 28.5000 504.7000

Аналогично, вы можете создать массив ячеек, содержащий данные температур test для пер-вых двух структур.

tests = {patient(1:2).test}

tests =

[3x3 double] [3x3 double]

Обращение к полям структуры с применением функций 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 (ртуть),

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.