Выполнение операций с полями и
элементами полей абсолютно аналогично операциям
с элементами обычного числового массива. В обоих
случаях надо использовать индексные выражения. Пример.
Вычислить среднее арифметическое строк
массива test для записи patient(2):
patient(2).test
Поле patient(2).test содержит следующий массив
ans =
68 |
70 |
68 |
118 |
118 |
119 |
172 |
170 |
169 |
Средние значения его строк могут быть
вычислены следующим образом
mean((patient(1,2).test)')
ans = 68.6667
118.3333
170.3333
Существует несколько способов применения
функций и операторов системы MATLAB для работы с
полями структуры:
- использование циклов;
- заключение обозначения поля в квадратные
скобки [<имя_структуры>.<имя_поля>].
Пример.
Рассмотрим операцию суммирования полей billing в
структуре patient:
использование цикла:
total = 0;
for j = 1:length(patient)
total
= total + patient(j).billing;
end
total
total = [ ]
Проверим длину записи patient и содержимое поля
patient.billing
[patient.billing]
ans = 127.0000
28.5000
length(patient)
ans = 3
Таким образом, одно из значений поля patient.billing
оказывается неприсвоенным и поэтому результат
total оказывается пустым.
Использование квадратных скобок для полей:
total = sum ([patient.billing])
total = 155.5000
Если одному или нескольким полям значения не
были присвоены, то результат приведенного выше
цикла будет пустым, в то время как применение
функции sum даст сумму значащих полей.
Суммирование значений некоторого поля
эквивалентно оператору
total =
sum([patient(1).billing, patient(2).billing...]);
Написание функций для работы со
структурами. Для обработки структур со
специфической архитектурой полей могут
понадобиться специальные функции обработки
полей и их элементов. При написании М-файлов для
обработки структур необходимо помнить, что
пользователь должен сам выполнить анализ
возникновения возможных ошибок, связанных с
обработкой полей.
Пример.
Рассмотрим набор данных, связанных с замером в
разные моменты времени токсинов в воде. Данные
состоят из 15 отдельных наблюдений, где каждое
наблюдение содержит три измерения. Можно
объединить эти данные в массив из 15 записей,
каждая из которых имеет 3 поля, по одному на
каждое измерение.
Приведенная ниже функция concen оперирует со
специфическими харктеристиками структуры,
содержащей поля lead, mercury и chromium, которым
соответствуют концентрации свинца, ртути и
хрома.
function [r1,r2] = concen(toxtest);
k =
length(toxtest);
%
Вычислить 2 вектора:
% r1
- отношение концентраций ртути к свинцу
% r2
- отношение концентраций свинцу к хрому.
for i
= 1:k
r1 = [toxtest.mercury]./[toxtest.lead];
r2 = [toxtest.lead]./[toxtest.chromium];
end
%
Графики концентраций свинца, ртути и хрома
for j
= 1:k
lead = [toxtest.lead];
mercury = [toxtest.mercury];
chromium = [toxtest.chromium];
end
plot(lead, 'r'); hold on
plot(mercury, 'b')
plot(chromium, 'g'); hold off
Проверим эту функцию на примере структуры 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; |
[r1, r2] = concen(test)
r1 = 0.3000 0.0290 0.0684
r2 = 0.2800 1.8235 0.1900
Рис. 6.3
|