Подобная запись эквивалентна использованию так называемого списка, разделенного запятой (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;
Организация данных в массиве структур
Ключ к организации массива структур состоит в выборе способа, которым вы хотите обращаться к подмассивам данных или отдельным данным структуры. Это, в свою очередь, определяет как вы дольжны построить массив, содержащий структуры и как выбирать поля
81
структуры. Например, рассмотрим RGB изображение размера 128х128, запомненное в трех различных массивах : RED, GREEN и BLUE.
Имеются по меньшей мере две возможности для организации таких данных в массив структур.
Плоская организация |
Поэлементная организация |
Плоская организация
В этом варианте, каждое поле структуры представляет полную плоскость изображения в красном, зеленом или синем цветах. Вы можете создать такую структуру используя запись
82
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);
end
end
При поэлементной организации, вы можете осуществить обращение к подмножествам данных при помощи единственного выражения:
Bsub = B(1:10, 1:10);
Однако, обращение к полной плоскости изображения при поэлементом методе требуется цикл :
red_plane = zeros(128,128); for i = 1 : (128*128)
red_plane(i) = B(i).r;
end
Поэлементая организация не является лучшим выбором для большинства приложений, связанных с обработкой изображений. Однако, она может быть лучшей для других приложений, когда вам требуется часто обращаться к отдельным подмножествам полей структур. Пример в следующем разделе демонстрирует данный тип приложен
83
Пример - Простая база данных
Рассмотрим организацию простой базы данных. |
|
А Плоская организация |
В Поэлементная организация |
Оба возможных способов организации базы данных имеет определенные проимущества, зависящие от того как вы хотите осуществить доступ к данным:
·Плоская организация обеспечивает более легкую возможность вычислений одновременно над всеми полями. Например, чтобы найти среднее значение всех данных в поле amount следует записать:
а) При плоской организации
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,:))
При использовании поэлементой организации вводится вся структура
84
function client(B) disp(B)
Для вызова функции client для второго клиента при этом просто записываем,
client(B(2))
·Поэлементная организация позволяет более просто расширять поля массивов строк. Если вы заранее не знаете максимальную длину строки при плоской организации, вам может потребоваться часто корректировать поляname или address , чтобы ввести более длинные строки.
Обычно данные не диктуют выбора организации базы данных. Скорее, вы сами должны решить, как вы хотите осуществлять доступ и операции над данными.
Вложенные структуры
Поле структуры может содержать другую структуру, и даже массив структур.Если вы уже имеете некоторую структуру, то для вложения новых структур в любое поле данной структуры вы можете воспользоваться как функцией struct, так и применить непосредственно оператор присваивания
Создание вложенных структур при помощи функции struct
Для создания вложенных структур вы можете применить функцию struct . Например, создадим массив структур размера 1х1 со вложенной в поле nest структурой:
A = struct('data',[3 4 7; 8 0 1],'nest',struct('testnum','Test 1', 'xdata',[4 2 8],'ydata',[7 1 6]));
Применим теперь операторы присваивания для добавления сторого элемента к массиву А:
A(2).data = [9 3 2; 7 6 5];
A(2).nest.testnum = 'Test 2';
A(2).nest.xdata = [3 4 2];
A(2).nest.ydata = [5 0 9];
85