48968 (597417), страница 12
Текст из файла (страница 12)
Функция reshape «действует» вдоль столбцов. Она создает преобразованную матрицу путем взятия последовательных элементов вдоль каждого столбца исходной матрицы.
Ниже в качестве примеров приведены несколько примеров массивов, которые могут быть получены из массива nddata (обратите внимание на размерности).
B = reshape(nddata,[6 25])
C = reshape(nddata,[5 3 10])
D = reshape(nddata,[5 3 2 5])
Удаление единичных размерностей.
Система MATLAB создает единичные размерности, когда вы задаете их при создании или преобразовании массива, или же в результате вычислений приводящих к появлению указан-ных размерностей.
B = repmat (5, [2 3 1 4] ) ;
size(B)
ans =
2 3 1 4
Функция squeeze удаляет единичные размерности из массива.
C = squeeze(B);
size(C)
ans =
2 3 4
Функция squeeze не оказывает воздействия на двумерные массивы – векторы-строки оста-ются строками.
Вычисления с многомерными массивами
Многие вычислительные и математические функции MATLAB-а принимают в качестве аргументов многомерные массивы. Эти функции действуют на определенные размерности многомерных массивов, в частности, на отдельные элементы, векторы или матрицы.
Действия над векторами
Функции которые действуют над векторами, такие как sum, mean, и т.д., по умолчанию обы-чно действуют вдоль первой неединичной размерности многомерного массива. Многие из этих функций дают возможность задать размерность вдоль которой они действуют. Однако, есть и исключения. Например, функция cross, которая определяет векторное произведение двух векторов, действует вдоль первой неединичной размерности, имеющей размер 3.
Внимание! Во многих случаях эти функции имеют другие ограничения на входные аргумен-ты – например, некоторые функции, допускающие многомерные входные массивы, требуют чтобы массивы имели одинаковый размер.
Поэлементное воздействие
Те функции MATLAB-а, которые действуют поэлементно на двумерные массивы, такие как тригонометрические и экспоненциальные функции, работают совершенно аналогично и в многомерном случае. Например, функция sin возвращает массив того же размера, что и вход-ной массив. Каждый элемент выходного массива является синусом соответствующего эле-мента входного массива. Аналогично, все арифметические, логические операторы и операторы отношения действуют с соответствующими элементами многомерных массивов (которые должны иметь одинаковые размеры каждой размерности). Если один из операндов является скаляром, а второй – скаляром, то операторы применяют скаляр ко всем элементам массива.
Действия над плоскостями и матрицами
Функции, действующие над плоскостями или матрицами, такие как функции линейной алге-бры или матричные функции в директории matfun , не принимают в качестве аргументов многомерные массивы. Иными словами, вы не можете использовать функции в директории matfun, или операторы *, ^, \, или /, с многомерными массивами. Попытка использования многомерных массивов или операндов в таких случаях приводит к сообщению об ошибке.
Вы можете, тем не менее, применить матричные функции или операторы к матрицам внутри многомерных массивов. Например, сооздадим трехмерный массив А
A = cat (3 , [1 2 3; 9 8 7; 4 6 5], [0 3 2; 8 8 4; 5 3 5], [6 4 7; 6 8 5; 5 4 3]);
Применение функции eig ко всему многомерному массиву дает сообщение об ошибке:
eig(A)
??? Error using eig
Input arguments must be 2-D.
Вы можете, однако, приментиь функцию eig к отдельным плоскостям в пределах массива. Например, воспользуемся оператором двоеточия для выделения одной страницы (допустим, второй):
eig(A(:, :, 2))
ans =
–2.6260
12.9129
2.7131
Внимание! В первом случае, где не используется оператор двоеточия, для избежания ошиб-ки нужно использовать функцию squeeze. Например, ввод eig (A(2,:,:)) приводит к ошибке так как размер входа есть [1 3 3]. Выражение eig(squeeze(A(2, :, :))), однако, передает функции eig допустимую двумерную матрицу.
Организация данных в многомерных массивах
Вы можете использовать два возможных варианта представления данных при помощи многомерных массивов:
-
Как плоскости (или страницы) двумерных данных. В дальнейшем вы можете обра-щаться с этими страницами как с матрицами.
-
Как многомерные данные. Например, вы можете иметь четырехмерный массив, где каждый элемент соответствует температуре или давлению воздуха, измеренным на равномерно распределенной трехмерной (пространственной) сетке в комнате.
В качестве конкретного примера рассмотрим представление какого-либо изображения в формате RGB. Напомним, что в формате RGB изображение хранится в виде трех двумерных матриц одинакового размера, каждая из которых характеризует интенсивность одного цвета – красного (Red), зеленого (Green) и синего (Blue) - в соответствующей точке. Общая карти-на при этом получается в результате наложения трех указанных матриц. Для отдельного изображения, использование многомерных массивов является, вероятно, наиболее легким путем для запоминания данных и доступа к ним.
Пусть все изображение хранится в файле RGB. Для доступа к полной плоскости изображе-ния в одном цвете, допустим – красном, следует записать
red_plane = RGB (:,:,1);
Для доступа к части всего изображения можно использовать запись
subimage = RGB (20:40, 50:85, :)
Изображение в формате RGB является хорошим примером данных, для которых может пот-ребоваться доступ к отдельным плоскостям, для операций типа фильтрации или просто де-монстрации. В других задачах, однако, сами данные могут быть многомерными. Рассмотри, например, набор температур, измеренных на равномерной пространственной сетке какого-либо помещения.
В данном случае пространственное положение каждого значения температуры является составной частью набора данных , то есть физическое расположение в трехмерном прос-транстве является частью информации. Такие данные также весьма прспособлены для представления при помощи многомерных массивов (см.рисунок выше).
Здесь, чтобы найти среднее значение всех измерений, то есть среднюю температуру воздуха в комнате, можно записать
mean (mean (mean (TEMP)))
где через TEMP обозначен массив четырехмерных данных.
Дл получения вектора «серединных» температур (элемента (2,2)) комнаты на каждой странице, то есть в каждом сечении, запишем
B = TEMP (2, 2, :).
ОРГАНИЗАЦИЯ И ХРАНЕНИЕ ДАННЫХ
Для хранения различных типов данных в системе MATLAB используются так называемые структуры (structure) и ячейки (cell). Структуры (иногда их называют массивами структур) служат для хранения массивов различных типов данных, организаванных по принципу пои-менованных полей. Ячейки (или массивы ячеек) являются специальным классом массивов системы MATLAB, чьи элементы состоят из ячеек, в которых могут храниться любые другие массивы данных, применяемые в MATLAB-е. Как структуры, так и ячейки обеспечивают иерархический механизм для хранения самых различных типов данных. Они отличаются друг от друга прежде всего способом организации базы данных. При использовании струк-тур доступ к данным осуществляется при помощи наименований полей, тогда как в массивах ячеек доступ осуществляется при помощи матричной индексации.
В приведенных ниже таблицах дается краткое описание функций MATLAB-а, предназначен-ных для работы с массивами структур и ячеек
Структуры
Функция | Описание |
fieldnames | Получить имена полей |
getfield | Получить содержание поля |
isfield | Истинно, если поле есть в структуре |
isstruct | Истинно, если структура |
rmfield | Удалить поле |
setfield | Установить содержимое поля |
struct | Создать массив структур |
struct2cell | Преобразовать структуру в массив ячеек |
Ячейки
Функция | Описание |
cell | Создать массив ячеек |
cell2struct | Преобразовать массив ячеек в структуру |
celldisp | Показать содержимое массива ячеек |
cellfun | Применить функцию к массиву ячеек |
cellplot | Показать графическую структуру массива ячеек |
deal | Обмен данными между любыми классами массивов |
iscell | Истинно для массивов ячеек |
num2cell | Преобразовать числовой масси в массив ячеек |
МАССИВЫ СТРУКТУР
Структуры это массивы данных с поименованными «хранилищами» данных, называемыми полями. Поля структуры могут содержать данные любого типа. Например, одно поле может содержать текстовую строку, представляющую имя (name), второе поле может содержать скалярную переменную, являющуюся счетом за лечение (billing), третье может содержать матрицу результатов медицинских анализов (test) и так далее.
Как и обычным масивам данных, структурам присущи основные свойства массивов. Одна структура является структурой размера 1х1, точно так же как число 5 является числовым массивом размера 1х1. Вы можете строить структуры с лбой допустимой размерностью или формы, включая многомерные массивы структур.
Создание массивов структур
Имеется два следующих способа создания структур:
-
Путем использования операторов присваивания.
-
С использованием функции struct.
Создание массивов структур с применением операторов присваивания.
Вы можете построить простую структуру размера 1х1 путем прямого присваивания значений индивидуальным полям. MATLAB при этом автоматически конструирует соответствующую структуру. Например, создадим 1х1 структуру данных пациента лечебницы, показанную в начале данного раздела. Для этого следует ввести следующие записи:
patient.name = 'John Doe';
patient.billing = 127.00;
patient.test = [79 75 73; 180 178 177.5; 220 210 205];
Если ввести теперь в командной строке запись
patient
то MATLAB ответит
name: 'John Doe'
billing: 127
test: [3x3 double]
patient является массивом, представляющим собой структуру с тремя полями. Для расшире-ния данного массива нужно просто добавить соответствующие индексы после имени струк-туры:
patient(2).name = 'Ann Lane';