"Вычисления, визуализация и программирование в среде MATLAB 5.x" - читать интересную книгу автора (Мартынов Н. Н., Иванов А. П.)

Объяснить работу этой функции можно, только исходя из способа, каким система MATLAB хранит элементы массивов в памяти компьютера. Она хранит их в непрерывной области памяти упорядоченно по столбцам: сначала располагаются элементы первого столбца, вслед за ними расположены элементы второго столбца и т. д. Помимо собственно данных (элементов массива) в памяти компьютера хранится также управляющая информация: тип массива (например, double), размерность и размеры массива и другая служебная информация. Этой информации достаточно для определения границ столбцов. Отсюда следует, что для переформирования матрицы функцией reshape достаточно изменить только служебную информацию и не трогать собственно данные.
Поменять местами строки матрицы с ее столбцами можно операцией транспонирования, которая обозначается знаком ' (апостроф). Например,
А =[ 1 1 1; 2 2 2; 3 3 3]; В = А'
MATLAB 5.x. Вычисления, визуализация, программирование 29
В =
1 2 3
1 2 3
12 3
Для квадратных матриц (число строк равно числу столбцов) эта операция имеет наглядную геометрическую интерпретацию: на своих местах остаются элементы главной диагонали квадратной матрицы, а остальные отражаются симметрично относительно этой диагонали.
Вектор-строки операцией транспонирования преобразовываются в вектор-столбцы, и наоборот:
v = [ 1; 2; 3]; u = v' ; и = 1 2 3
В рассмотренном примере вектор-столбец v операцией транспонирования был преобразован в вектор-строку и.
Многомерные числовые массивы
Многомерными называются массивы с размерностью больше двух. Для индексации элементов таких массивов требуется три или более индекса, указывающие на положение выбираемого элемента вдоль нескольких направлений упорядочения.
Дадим наглядную иллюстрацию многомерных массивов на примере массива трех измерений (размерность равна трем). Допустим, что ежедневно в течение месяца проводятся измерения одних и тех же величин, причем значения этих величин за один день сводятся в прямоугольную таблицу. Тогда в конце месяца имеются 30 двумерных таблиц. Как упорядочить всю эту совокупность опытных данных? Для этого можно расположить эти матрицы вдоль некоторого направления и пронумеровать их. Это будет уже третье направление упорядочения данных, так как вдоль первого направления (условно - вертикального) упорядочиваются строки, вдоль второго (горизонтального) - столбцы. В результате третий индекс для доступа к отдельному элементу данных будет равен номеру таблицы вдоль направления дней месяца. Получившаяся совокупность упорядоченных данных иллюстрируется рис. 1.16.
Если создать трехмерный массив А1, содержащий упорядоченные указанным образом данные, то к индивидуальному данному можно обращаться с помощью трех индексов. Элемент А1 (1,2,2) находится в первой строке, втором столбце и во второй матрице. Из рисунка видно, что этот элемент равен 3.
30
Глава 1. Числовые массивы в системе MATLAB
3 4 3. 5 8 9.
2 5 1 .... 6
Матрица измерений за 30-й день
Матрица измерений за 2-й день
Матрица измерений за 1-й день
Рисунок 1.1 6
Теперь изучим способы создания таких массивов. Первый способ - это прямое прописывание всех его элементов:
А1 (1,1,1) =3; А1 (2,1,1)=5;... А1(1,2,1) =4; А1(2,2,1)=8;...
А1(1,1,2) =2; А1(2,1,2)=3;... А1(1,2,2) =3; А1(2,2,2)=1;...
А1 (1,1, 30)=7; А1(2,1,30)=4;... Al(l,2,30)=7; A1 (2, 2, 30) =4;...
Здесь для многократного увеличения эффективности целесообразно первым прописать самый правый нижний элемент 30-й матрицы, так как система MAT-LAB сразу получит информацию об истинном размере создаваемого трехмерного массива.
Другим способом увеличения эффективности (быстродействия), как и в ранее рассмотренных случаях векторов и матриц, является создание массива нужного размера вызовом функций ones или zeros, которые теперь должны получить три входных аргумента:
ones( M, N, L ) или zeros( M, N, L )
где L - это размер трехмерного массива вдоль третьего измерения. Созданные указанными функциями трехмерные массивы содержат в качестве элементов либо единицы, либо нули. Далее нужно осуществить прописывание индивидуальных элементов правильными значениями. Процесс будет эффективным, так как не потребуется перестройка структуры массива с каждым новым присваиванием.
Теперь предположим, что в трехмерном массиве А2 собраны данные измерений за другой месяц года. Как собрать воедино данные трехмерных массивов А1 и А2 ? Достаточно очевидным решением будет их группировка вдоль четвертого
MATLAB 5.x. Вычисления, визуализация, программирование 31
измерения - измерения вдоль месяцев. Технически такая группировка является конкатенацией. Однако применить операцию конкатенации, которая обозначается квадратными скобками, невозможно, поскольку ее разделители в виде запятой (пробела) и точки с запятой допускают конкатенацию только вдоль двух первых измерений. Нам же сейчас нужно осуществить конкатенацию трехмерных массивов вдоль четвертого измерения. На помощь приходит второй из известных способов выполнения конкатенации - с помощью функции cat. Эта функция не имеет никаких ограничений и в данном конкретном примере вызывается в следующем виде:
А = cat( 4, Al, A2 )
где число 4 задает номер измерения, вдоль которого осуществляется конкатенация.
Ясно, что если потребуется группировка данных, полученных за разные годы, то можно осуществить конкатенацию вдоль пятого направления и получится пятимерный массив (массив размерности 5).
Проиллюстрируем все сказанное про многомерные массивы на следующем простом примере. Сначала создадим трехмерный массив а:
а = ones( 2, 3, 2 ); а( 1, 2, 2 ) = 7 а(:,:,1) = 1 1 1 1 1 1
а(:,:,2) = 1 7 1 1 1 1
состоящий из двух матриц размером 2x3, сгруппированных в третьем направлении (измерении). При показе входящих в этот трехмерный массив матриц MATLAB использует для обозначения первой из них выражение а (:, :, 1), а для обозначения второй матрицы - выражение а (:, :, 2). Такие обозначения не могут быть сейчас до конца поняты, так как мы еще ничего не рассказывали о применении операции двоеточие (операция задания диапазона значений) при индексации массивов. Мы подробно остановимся на этом вопросе ниже в данной главе пособия, а сейчас только скажем, что операция : задает весь возможный диапазон индексов для данного измерения.
Далее по той же схеме создадим трехмерный массив Ь:
b = ones( 2, 3, 2 ); Ь( 1, 1, 1 ) = 8 Ь(:,:,1) = 8 1 1 111
32 Глава 1. Числовые массивы в системе MATLAB
1 1 1 1 1 1
Наконец, сгруппируем эти два трехмерных массива вдоль четвертого измерения, а результат присвоим массиву с. Такая операция группировки возможна, поскольку трехмерные массивы а и b имеют одинаковые размеры. В противном случае возникла бы ошибка. Для выполнения группировки (конкатенации) воспользуемся функцией cat:
с = cat( 4, a, b );
Для полученного массива с вызов функции ndims ( с ) вернет число 4, что означает, что с является массивом размерности 4. Размер массива с вдоль каждой из его четырех размерностей можно узнать вызовом функции size. Эта функция возвращает вектор-строку из четырех элементов. Первый из этих элементов равен размеру массива вдоль первого измерения, второй элемент дает размер вдоль второго измерения и т. д.:
v = size ( с ) v =