Удаление поля из структуры
Вы можете удалить любое поле заданной структуры при помощи функции 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;
Подобный подход позволяет вам легко извлекать полное изображение в отдельных состав-ляющих цветов, для решения таких задач как фильтрация. Например, для обращения ко всей красной плоскости нужно просто записать
red_plane = A.r;
Плоская организация имеет то дополнительное преимущество, что массив структур можно без труда дополнить другими изображениями. Если у вас есть набор изображений, вы може-те запомнить их как A(2), A(3), и так далее, где каждая структура содержит полное изобра-жение.
Недостаток плоской организации становится очевичным, когда вам нужно обратиться к от-дельным частям изображения. В этом случае вы должны оперировать с каждым полем в от-дельности:
red_sub = A.r (2:12, 13:30);
grn_sub = A.g (2:12, 13:30);
blue_sub = A.b (2:12, 13:30);
Поэлементная организация
Данный вариант имеет то преимущество, что обеспечивает простой доступ к подмножествам данных. Для организации данных в данной форме нужно использовать команды
for i = 1:size(RED,1)
for j = 1:size(RED,2)
B(i,j) .r = RED(i,j);
B(i,j) .g = GREEN(i,j);
B(i,j) .b = BLUE(i,j);
При поэлементной организации, вы можете осуществить обращение к подмножествам дан-ных при помощи единственного выражения:
Bsub = B(1:10, 1:10);
Однако, обращение к полной плоскости изображения при поэлементом методе требуется цикл :
red_plane = zeros(128,128);
for i = 1 : (128*128)
red_plane(i) = B(i).r;
Поэлементая организация не является лучшим выбором для большинства приложений, свя-занных с обработкой изображений. Однако, она может быть лучшей для других приложений, когда вам требуется часто обращаться к отдельным подмножествам полей структуры. Пример в следующем разделе демонстрирует данный тип приложен
Пример - Простая база данных
Рассмотрим организацию простой базы данных.
А Плоская организация В Поэлементная организация
Оба возможных способов организации базы данных имеет определенные проимущества, зависящие от того как вы хотите осуществить доступ к данным:
а) При плоской организации
avg = mean(A.amount);
б) При поэлементной организации
avg = mean([B.amount]);
Поэлементная организация дает более легкий доступ ко всей информации, связанной с одним клиентом. Рассмотрим М-файл, названный client.m, который осуществляет вывод на экран имени и адреса любого клиента. При использовании плоской организации, следует вводить в качестве аргументов индивидуальные поля:
function client(name,address, amount)
disp(name)
disp(address)
disp(amount)
Для вызова функции client для второго клиента записываем,
client(A.name(2,:),A.address(2,:), A. amount (2,:))
При использовании поэлементой организации вводится вся структура
function client(B)
disp(B)
Для вызова функции client для второго клиента при этом просто записываем,
client(B(2))
Обычно данные не диктуют выбора организации базы данных. Скорее, вы сами должны решить, как вы хотите осуществлять доступ и операции над данными.
Страницы: 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, 34, 35