p align="left">Используя индексацию массива структур, можно осуществить обращение к данным любого поля или любого элемента поля в массиве структуры. Аналогичным образом, вы можете за-дать значение любого поля или элемента поля структуры. В качестве примера, используемо-го в данном разделе, рассмотрим структуру, представленную на приведенном ниже рисунке. Вы можете обратиться к подмассивам путем дабавления стандартной индексации к имени массива структур. Например, следующая запись приводит к структуре размера 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 со следующими данны-ми test(1).lead = .007; test(2).lead = .031; test(3).lead = .019; test(1).mercury = .0021; test(2).mercury = .0009; test(3).mercury = .0013; test(1).chromium = .025; test(2).chromium = .017; test(3).chromium = .10; Организация данных в массиве структур Ключ к организации массива структур состоит в выборе способа, которым вы хотите обра-щаться к подмассивам данных или отдельным данным структуры. Это, в свою очередь, оп-ределяет как вы дольжны построить массив, содержащий структуры и как выбирать поля структуры. Например, рассмотрим RGB изображение размера 128х128, запомненное в трех различных массивах : RED, GREEN и BLUE. Имеются по меньшей мере две возможности для организации таких данных в массив струк- тур. Плоская организация Поэлементная организация Плоская организация В этом варианте, каждое поле структуры представляет полную плоскость изображения в красном, зеленом или синем цветах. Вы можете создать такую структуру используя запись A.r = RED; A.g = GREEN; A.b = BLUE;
Страницы: 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
|