48968 (597417), страница 13

Файл №597417 48968 (Система математических расчетов MATLAB) 13 страница48968 (597417) страница 132016-07-30СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 13)

patient(2).billing = 28.50;

patient(2).test = [68 70 68; 118 118 119; 172 170 169];

Структура patient имеет теперь размер [1 2]. Отметим, что если массив структур содержит более одного элемента, то MATLAB уже не выводит на экран содержание отдельных полей при вводе имени структуры. Взамен, на дисплей выдаются общая информация о содержимом структуры, то есть имена полей:

Patient

patient =

1x2 struct array with fields:

name

billing

test

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

  • Все структуры в массиве имеют одинаковое число полей.

  • Все соответствующие поля имеют одинаковые имена.

Например, при вводе

patient(3).name = 'Alan Johnson'

структура patient принимает размер 1х3. При это оба поля patient(3).billing и patient(3).test содержат пустые матрицы.

Внимание! Размеры данных в одноименных полях могут быть различными. В нашем при-мере со структурой patient поля name могут иметь различную длину, поля test могут содер-жать массивы числовых данных различных размеров и так далее.

Создание массива структур с использованием функции struct.

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

str_array = struct ('поле1',знач1,'поле2',знач2, ...)

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

Вы можете использовать различные методы для задания массива структур. Эти методы отличаются способом инициализации полей структуры. В качестве примера расмотрим зада-ние структуры размера 1х3 с именем weather (погода), имеющую поля temp (температура)

и rainfall (дождевые осадки). Три различные способа задания такой структуры даны в приведенной ниже таблице.

Метод

Синтаксис

Задание

Функция struct

weather(3) = struct('temp',72,'rainfall',0.0);

Структура weather(3) инициализируется с указан-ными значениями полей. По-ля остальных двух структур в массиве, weather(1) и weather(2), содержат в качес-тве данных пустые матрицы.

Сочетание функций struct и repmat

weather =

repmat (struct ('temp', 72,

'rainfall', 0.0), 1, 3);

Все структуры в массиве weather инициализируются с использованием одинаковых значений одноименных полей.

Функция struct с использованием синтаксиса ячеек

weather =

struct ('temp',{68, 80, 72},

'rainfall', {0.2,0.4,0.0} );

Структуры в массиве weather инициализируются с разными значениями полей, заданных массивом ячеек.

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

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

Вы можете обратиться к подмассивам путем дабавления стандартной индексации к имени массива структур. Например, следующая запись приводит к структуре размера 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 (ртуть),

и 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')

plot(chromium,'y'); hold off

Данная функция создает два вектора. r1 содержит отношение ртути к свинцу в каждом наб-людении, а r2 содержит отношение свинца к хрому. Далее эта функция строит кривые кон-центрации свинца, ртути и хрома на одном графике, используя разные цвета (красный – сви-нец, синий – ртуть, желтый – хром).

Попробуйте применить данную функцию на примеры структуры test со следующими данны-ми

Характеристики

Тип файла
Документ
Размер
9,13 Mb
Тип материала
Учебное заведение
Неизвестно

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6549
Авторов
на СтудИзбе
300
Средний доход
с одного платного файла
Обучение Подробнее