Система математических расчетов MATLAB
% 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);
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
Поэлементая организация не является лучшим выбором для большинства приложений, свя-занных с обработкой изображений. Однако, она может быть лучшей для других приложений, когда вам требуется часто обращаться к отдельным подмножествам полей структуры. Пример в следующем разделе демонстрирует данный тип приложен
Пример - Простая база данных
Рассмотрим организацию простой базы данных.
А Плоская организация В Поэлементная организация
Оба возможных способов организации базы данных имеет определенные проимущества, зависящие от того как вы хотите осуществить доступ к данным:
· Плоская организация обеспечивает более легкую возможность вычислений одновре-менно над всеми полями. Например, чтобы найти среднее значение всех данных в поле 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,:))
При использовании поэлементой организации вводится вся структура
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];
Индексация вложенных структур
Для обращения к вложенным структурам, нужно просто добавить имена вложенных полей с использование точечных разделителей. Первая текстовая строка в индексированном выраже-нии определяет массив структур, а последующие выражения дают доступ к полям, содержа-щим другие структуры. Например, массив А, созданный ранее, имеет три уровня вложения:
· Для обращения к вложенной структуре внутри А(1) запишем A(1).nest.
· Для обращения к полю xdata во вложенной структуре в A(2) запишем A(2).nest.xdata.
· Для обращения к элементу 2 поля ydata в A(1), запишем A(1).nest.ydata(2).
МАССИВЫ ЯЧЕЕК
Массивы ячеек это массивы данных системы MATLAB элементы которых являются ячейка-ми и могут служить «хранилищами» для других массивов данных. Например, одна ячейка массива ячеек может содержать матрицу действительных чисел, другая ячейка - массив тек-стовых строк, а третья - вектор комплексных значений.
Вы можете конструировать массивы ячеек любых допустимых размерностей и форм, вклю-чая многомерные массивы ячеек.
Создание массивов ячеек
Вы можете создавать массивы ячеек двумя способами:
· Используя операторы присваивания.
· Используя функцию cell, а затем назначая данные созданных ячеек.
Применение операторов присваивания
Вы можете создать массив ячеек путем присваивания данных индивидуальным ячейкам, по одной ячейке за один раз. MATLAB при этом автоматически создает требуемый массив яче-ек. Существуют два способа индексации данных ячеек:
· Индексация ячеек
Заключите индексы ячейки в обычные скобки с использованием стандартной индексации массивов. Заключите содержимое ячейки в правой стороне оператора присваивания в фигур-ные скобки “{}”. Например, создадим массив ячеек А размера 2х2.
A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
A(1,2) = {'Anne Smith'};
A(2,1) = {3+7i};
A(2,2) = {-pi:pi/10:pi};
Внимание! Запись “{}” обозначает пустой массив ячеек, точно так же как “[ ]” обозначает пустую матрицу для числовых массивов. Вы можете использовать пустой массив ячеек в лю-бых выражениях с массивами ячеек.
· Индексация содержимого ячеек
Заключите индексы ячейки в фигурные скобки, применяя стандартные обозначения масси-вов. Задайте содержимое ячейки в правой части оператора присваивания в обычном виде.
A{1,1} = [1 4 3; 0 5 8; 7 2 9];
A{1,2} = 'Anne Smith';
A{2,1} = 3+7i;
A{2,2} = -pi:pi/10:pi;
Различные примеры, приведенные ниже, используют оба приведенных синтаксиса. Обе фор-мы записи являются вполне взаимозаменяемыми.
Внимание! Если вы уже имеете числовой массив с заданным именем, не пытайтесь создать массив ячеек с помощью операторов присваивания, не уничтожив предаврительно числовой массив. Если вы не очистите числовой массив, MATLAB примет, что вы пытаетесь «сме-шать» синтаксисы ячеек и числовых массивов и выдаст сообщение об ошибке.
MATLAB выводит содержимое массива ячеек на дисплей в сжатой форме. Для нашего мас-сива А мы получим.
A =
[3x3 double] 'Anne Smith'
[3.0000+ 7.0000i] [1x21 double]
Для вывода полного содержания ячеек, нужно воспользоваться функцией celldisp. Для гра-фического вывода на дисплей архитектуры ячейки служит функция cellplot. Если вы назна-чаете данные ячейке, которая находится вне размерности имеющегося массива ячеек, MATLAB автоматически расширяет массив, чтобы включить заданный вами элемент. При этом промежуточные ячейки заполняются пустыми матрицами. Например, приведенный ни-же оператор присваивания превращает массив ячеек А размера 2х2 в массив размера 3х3.
A(3,3) = {5};
Все остальные ячейки третьего столбца и третьей строки при этом будут содержать пустые матрицы.
Использование фигурных скобок для построения массивов ячеек
Фигурные скобки, “{}”, являются такими же конструктурами массивов ячеек, как квадрат-ные скобки являются конструкторами числовых массивов. Фигурные скобки используются совершенно аналогично квадратным скобкам, за тем исключением, что их можно использо-вать для вложения массивов ячеек (см. ниже).
При конструировании массивов с использованием фигурных скобок нужно использовать пробелы или запятые для разделения столбцов, и точки с запятой для разделения строк. На-пример, ввод
C = {[1 2], [3 4]; [5 6], [7 8]};
приводит к следующему массиву ячеек размера 2х2
Для объединения отдельных массивов ячеек в новые массивы, вы можете использовать квадратные скобки, как и при объединении числовых массивов.
Задание массивов ячеек при помощи функции cell
Функция cell позволяет создавать пустые массивы ячеек заданного размера. Например, сле-дующее выражение создает пустоймассив ячеек размера 2х2.
B = cell(2, 3);
Для заполнения ячеек массива В нужно прменить операторы присваивания:
B(1,3) = {1:3};
Доступ к данным массивов ячеек
Вы можете извлекать данные из массивов ячеек или же запоминать данные в имеющемся или вновь созданном массиве ячеек двумя способами:
· Использованием индексации содержимого ячеек при помощи обычных индексов.
· Использованием индексов, заключенных в фигурные скобки.
Доступ к данным массивов ячеек с использованием фигурных скобок
Вы можете использовать индексирование содержимого в правой части выражения для обра-щения ко всем данным в какой-либо отдельной ячейке. Для этого в левой части выражения следует задать переменную для записи содержимого ячейки. Заключите индексы ячеек в фигурные скобки. Это означает, что вы обращаетесь к содержимому ячейки. Рассмотрим следующий массив N размера 2х2:
N{1,1} = [1 2; 4 5];
N{1,2} = 'Name';
N{2,1} = 2 - 4i;
N{2,2} = 7;
Вы можете получить строку в N{1,2} записав
c = N{1,2}
При вводе данной строки MATLAB выдаст
c =
Name
Внимание! В операторах присваивания вы можете использовать индексацию содержимого только для обращения к одной ячейке, а не к подмножеству ячеек. Например, оба выражения
A{1, :} = value и B = A{1, :} являются неправильными.
Для обращения к подмножествам содержимого одной ячейки нужно объединить индексиро-вание. Например, чтобы получить элемент (2,2) массива в ячейке N{1,1}, следует записать:
d = N{1,1} (2,2)
что даст
d =
5
Обращение к подмножествам массива ячеек
Для присваивания любого множества ячеек некоторой переменной, нужно воспользоваться индексацией содержимого ячеек. При этом оператор двоеточия служит для доступа к под-множествам ячеек в пределах иассива ячеек.
Удаление ячеек
Вы можете удалить полностью любую размерность массива ячеек с использованием одного выражения. Как и в стандартном случае удаления массивов, нужно использовать векторное индексирование при удалении строк или столбцов массива ячеек, с приравниванием данной размерности пустой мастрице, например
.
A(:, 2) = [ ]
При удаленни ячеек, фигурные скобки вообще не используются в соответствующих выра-жениях.
Изменение формы (размерностей) массива ячеек
Ка и в случае любых других массивов, для изменения формы массива ячеек можно приме-нить функцию reshape. При этом общее число ячеек должно остаться тем же, то есть вы не можете использовать данную функцию для добавления или удаления ячеек.
A = cell(3, 4);
size(A)
ans =
3 4
B = reshape(A,6,2);
size(B)
ans =
6 2
Замена списка переменных массивами ячеек
Массивы ячеек могут быть ипользованы для замены списка переменных MATLAB-а в сле-дующих случаях:
· В списке входных аргументов.
· В списке выходных переменных.
· В операциях отображения на дисплей.
· При конструировании массивов (квадоатные скобки и фигурные скобки).
Если вы используете оператор двоеточия для индексации набора ячеек в сочетании с фигур-ными скобками, то MATLAB обращается с каждой ячейкой как с отдельной переменной. Например, допустим вы имеете массив ячеек T, где каждая ячейка содержит отдельный век-тор. Выражение T{1:5} эквивалентно списку векторов в первых пяти ячейках массива T, то есть оно равносильно записи
[ T{1} , T{2} , T{3} , T{4} , T{5} ]
Рассмотрим массив ячеек C:
C(1) = {[1 2 3]};
C(2) = {[1 0 1]};
C(3) = {1:10};
C(4) = {[9 8 7]};
C(5) = {3};
Для свертки векторов в C(1) и C(2) с использованием функции conv, нужно записать
d = conv(C{1:2})
d =
1 2 4 2 3
Для вывода на дисплей векторов со второго по четвертый введем
C{2:4}
Это даст
ans =
1 0 1
ans =
1 2 3 4 5 6 7 8 9 10
ans =
9 8 7
Аналогично, вы можете создать новый числовой массив используя выражение
B = [ C{1}; C{2}; C{4} ]
что приводит к
B =
1 2 3
1 0 1
9 8 7
Вы можете также использовать соответствующую индексацию в левой части оператора при-сваивания для создания нового массива ячеек, где каждая ячейка содержит один выходной аргумент
[D{1:2}] = eig (B)
D =
[3x3 double] [3x3 double]
Напомним, что при задании двух выходных аргументов, выходом функции eig(B) является модальная матрица, составленная из нормированных собственных векторов матрицы B и ди-агональная матрица собственных значений. Вы можете вывести в командное окно действи-тельные значения собственных векторов и значений вводя D{1} и D{2}.
Применение функций и операторов
Для применения функций или операторов к содержимому ячеек нужно воспользоваться со-ответствующей индексацией. Например, зададим массив ячеек А
A{1, 1} = [1 2; 3 4];
A{1, 2} = randn (3,3);
A{1, 3} = 1 : 5;
Тогда, для применения функции sum к содержимому первой ячейки массива запишем
B = sum (A{1,1})
Что приводит к следующему результату
B =
4 6
Для применения той же функции к нескольким ячейкам не вложенных массивов ячеек, нуж-но применить цикл:
for i = 1:length(A)
M{i} = sum(A{1,i});
end
Организация данных в массивах ячеек
Массивы ячеек являются полезными для создания базы данных, состоящих из массивов раз-личных значений и типов. Массивы ячеек являются предпочтительнее структур в приложе-ниях, где:
· Вам нужен доступ ко многим полям данных при помощи одного обращения.
· Вы хотите иметь доступ к подмножеству данных в виде списка значений.
· У вас нету фиксированного набора имен полей.
· Вам приходится часто удалять поля из структуры.
Как пример обращения к набору множества полей при помощи одного выражения допустим, что ваши данные состоят из:
· Массива размера 3х3, состоящего из измерений, полученных экспериментально.
· Строки из 15 символов, содержащей имя инженера.
· Массива размера 3х4х5, содержащего записи измерений за последние 5 эксперимен-тов.
Для многих приложений, наилучшим способом создания базы данных являются структуры. Однако, если вы постоянно имеете дело только с первыми двумя полями данных, то массив ячеек может быть более удобным для целей индексации.
Приведенный ниже пример показывает как можно обратиться к первым двум элементам мас-сива ячеек TEST.
[newdata, name] = deal (TEST{1:2})
а следующий пример демонстрирует то же при организации данных в виде структуры с тем же именем TEST:
newdata = TEST.measure
name = TEST.name
Вложение массивов ячеек
Массив ячеек может содержать другой массив ячеек и даже масси массивов ячеек (Массивы, не содержащие другие массивы ячеек называются листовыми ячейками (leaf cells).) Для соз-дания вложенных массивов ячеек вы можете использовать вложенные фигурные скобки, фу-нкцию cell, или непосредственное применение операторов присваивания.
Создание вложенных массивов при помощи вложенных фигурных скобок
Для указанной в заголовке цели достаточно вложить в требуемую ячейке пару фигурных ско-бок. Например, введем следующие команды
clear A
A(1,1) = {magic(5)};
A(1,2) = { { [ 5 2 8; 7 3 0; 6 7 3] 'Test 1'; [2 - 4i 5 + 7i] {17 [ ] } } }
что даст
A =
[5x5 double] {2x2 cell}
Отметим, что правая часть второго оператора присваивания заключена в две пары фигурных скобок. Первая пара характеризует ячейку cell (1,2) массива ячеек A. Второй “набор” скобок представляет массив ячеек размера 2х2 внутри внешней ячейки.
Создание вложенных массивов при помощи функции cell
Для вложения массива ячеек при помощи функции cell, нужно назначить выход функции cell сушествующей ячейке. Например,
1. Создадим пустой массив размера 1х2
A = cell (1, 2);
2. Создадим массив ячеек размера 2х2 внутри A(1,2).
A(1,2) = {cell(2,2)};
3. Заполним массив А, используя выражения
A(1,1) = {magic(5)};
A{1,2}(1,1) = {[5 2 8; 7 3 0; 6 7 3]};
A{1,2}(1,2) = {'Test 1'};
A{1,2}(2,1) = {[2-4i 5+7i]};
A{1,2}(2,2) = {cell(1,2)}
A{1,2}{2,2}(1) = {17};
Отметим использование фигурных скобок до последнего уровня вложенных индексов.
Вы также можете конструировать вложенные массивы ячеек непосредственно с использова-нием операторов присваивания, как это показано в шаге 3 выше.
Индексация вложенных массивов ячеек
Для индексации вложенных ячеек нужно объединить выражения индексов. Первый набор индексов обеспечивает доступ к верхнему уровню ячеек, а последующие наборы скобок обеспечивают последовательный доступ к последующим уровням. Например, следующий массив имеет три уровня вложения
· Для доступа к массиву 5х5 ячейке (1,1) используйте A{1,1}.
· Для доступа к массиву 3х3 в позиции (1,1) ячейки (1,2) используйте A{1,2}{1,1}.
· Для доступа к ячейке 2х2 в ячейке (1,2) используйте A{1,2}.
· Для доступа к пустой ячейке в позиции (2,2) ячейки (1,2) запишем A{1,2}{2,2}{1,2}.
Преобразования между массивами ячеек и числовыми массивами
Для перехода от формата массива ячеек к числовому массиву следует воспользоваться прог-раммой, включающей цикл. Например, создадим массив ячеек F:
F{1,1} = [1 2; 3 4];
F{1,2} = [-1 0; 0 1];
F{2,1} = [7 8; 4 1];
F{2,2} = [4i 3+2i; 1 - 8i 5];
Используем теперь три вложенных цикла для копирования содержимого массива F в число-вой массив NUM.
for k = 1:4
for i = 1:2
for j = 1:2
NUM(i,j,k) = F{k}(i,j);
end
end
end
Аналогично, вы должны использовать петли for для присваивания каждого значения число-вого массива одной ячейке массива ячеек:
G = cell(1,16);
for m = 1:16
G{m} = NUM(m);
end
Массивы ячеек, содержащие структуры
Для хранения групп структур с различной архитектурой полей можно использовать массивы ячеек
c_str = cell(1,2);
c_str{1}.label = '12/2/94 - 12/5/94';
c_str{1}.obs = [47 52 55 48; 17 22 35 11];
c_str{2}.xdata = [-0.03 0.41 1.98 2.12 17.11];
c_str{2}.ydata = [-3 5 18 0 9];
c_str{2}.zdata = [0.6 0.8 1 2.2 3.4];
Ячейка l массива c_str содержит структуру с двумя полями, где в одном поле хранится стро-ка символов, а во втором - вектор. Ячейка 2 содержит структуру с тремя полями векторов.
При создании массивов ячеек, содержащих структуры, вы должны применить индексирова-ние фигурными скобками. Аналогично, вы должны применить фигурные скобки для получе-ния структур, содержащихся внутри ячеек. Общий синтаксис при этом имеет вид:
cell_array{index}.field
Например, чтобы получить содержимое поля label структуры в ячейке 1 нужно записать
c_str{1}.label
Многомерные массивы ячеек
Как и в случае числовых массивов, общие принципы создания многомерных массивов ячеек основаны на распространении понятия двумерных массивов ячеек. Для создания многомер-ных массивов ячеек вы можете применить функцию cat, совершенно аналогично ее примен-ению в случае числовых массивов.
Например, создадим простой трехмерный массив ячеек С из двух массивов А и В:
A{1,1} = [1 2; 4 5];
A{1,2} = 'Name';
A{2,1} = 2 - 4i;
A{2,2} = 7;
B{1,1} = 'Name2';
B{1,2} = 3;
B{2,1} = 0:1:3;
B{2,2} = [4 5]';
C = cat(3,A,B);
Общая структура индексации массива ячеек С имеет вид
Многомерные массивы структур
Многомерные массивы структур явлеются распространением обычных двумерных, то есть плоских структур. Подобно другим типам многомерных массивов, вы можете строить их как прямым присваиванием, так и применением функции cat.
patient(1,1,1).name = 'John Doe';
patient(1,1,1).billing = 127.00;
patient(1,1,1).test = [79 75 73; 180 178 177.5; 220 210 205];
patient(1,2,1).name = 'Ann Lane';
patient(1,2,1).billing = 28.50;
patient(1,2,1).test = [68 70 68; 118 118 119; 172 170 169];
patient(1,1,2).name = 'Al Smith';
patient(1,1,2).billing = 504.70;
patient(1,1,2).test = [80 80 80; 153 153 154; 181 190 182];
patient(1,2,2).name = 'Dora Jones';
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9
|