Доступ к отдельному элементу многомерного массива
Доступ к отдельному элементу многомерного массива
Чтобы вызвать центральный элемент сначала первой, а затем второй страницы, надо записать следующие выражения:
» М(2.2,1)
ans =
5
» МС2.2.2)
ans =
14
Таким образом, в многомерных массивах используется то же правило индексации, что и в одномерных и двумерных. Произвольный элемент, например, трехмерного массива задается как М(1 .j.k), где 1 — номер строки, j — номер столбца и k — номер страницы. Этот элемент можно вывести, а можно присвоить ему заданное значение х: М(1 ,j,k)=x.
Использование функций ones, zeros, rand и randn
Использование функций ones, zeros, rand и randn
Функции ones (создание массивов с единичными элементами), zeros (создание массивов с нулевыми элементами) и rand или randn (создание массивов с элементами — случайными числами с соответственно равномерным и нормальным распределением) могут также использоваться для создания многомерных массивов. Примеры приводятся ниже:
» E=ones(3.3.2)
E(:.:.1)=
1 1 1
1 1 1
1 1 1
E(:.:,2) =
1 1 1
1 1 1
1 1 1
» Z=zeros(2,2,3) Z(:,:.l) =
0 0
0 0
Z(:.:.2) =
0 0
0 0
Z(:.:,3) =
0 0
0 0
» R=randn(3,2.2) R(:.:.l) =
-1.6656-1.1465
0.1253 1.1909
0.2877 1.1892
R(:.:,2) =
-0.0376-0.1867
0.3273 0.7258
0.1746 -0.5883
Эти примеры достаточно очевидны и не требуют особых комментариев. Обратите, однако, внимание на легкость задания размеров массивов для каждой размерности. Кроме того, следует отметить, что если хотя бы одна размерность массива равна нулю, то массив будет пустым:
» A=randn(3,3,3,0)
А =
Empty array: 3-bу-3-bу-3-by-0
Как видно из данного примера, пустой массив возвращается с соответствующим комментарием.
Объединение массивов
Объединение массивов
Для создания многомерных массивов служит описанная ранее для матриц специальная функция конкатенации cat:
cat(DIM,A,B) — возвращает результат объединения двух массивов А и В вдоль размерности DIM;
cat(2.A.B) — возвращает массив [А.В], в котором объединены ряды (горизонтальная конкатенация);
cat(1, А.В) — возвращает массив [А:В], в котором объединены столбцы (вертикальная конкатенация);
B=cat(DIM.Al,A2,...) — объединяет множество входных массивов Al, A2,... вдоль размерности DIM.
Функции cat(DIM,C{:}) и cat(DIM.C.FIELD) обеспечивают соответственно конкатенацию (объединение) ячеек массива ячеек (см урок 15) или структур массива структур (см. урок 14), содержащих числовые матрицы, в единую матрицу. Ниже приводятся примеры применения функции cat:
» М1=[1 2:3 4]
M1=
1 2
3 4
» М2=[5 6:78]
М2 =
5 6
7 8
» catd.Ml.M2)
ans =
1 2
3 4
5 б
7 8
» cat(2.Ml.M2)
ans=
1 2 5 6
3 4 7 8
» M-cat(3.Ml.M2) M(:,:.l) =
1 2
3 4
М(:,:,2) =
5 6
7 8
Перестановки размерностей массивов
Перестановки размерностей массивов
Если представить многомерный массив в виде страниц, то их перестановка является перестановкой размерностей массива. Для двумерного массива перестановка часто означает транспонирование — замену строк столбцами и наоборот. Следующие функции обобщают транспонирование матриц для случая многомерных массивов и обеспечивают перестановку размерностей многомерных массивов:
permute (A, ORDER) — переставляет размерности массива А в порядке, определяемом вектором перестановок ORDER. Вектор ORDER — одна из возможных перестановок всех целых чисел от 1 до N, где N — размерность массива А;
ipermuteCA, ORDER) — операция, обратная permute: permute(permute(A. ORDER), ORDER)=A
Ниже приводятся примеры применения этих функций и функции size:
» А=[1 2: 3 4]:
» В=[5 6; 7 8];
» С=[9 10; И 12];
» D=cat(3.A,B.C)
D(:,:,l) =
1 2
3 4
9 10
11 12
» size(D)
ans =
2 2 3
» size(permute(D.[3 2 1]))
ans=
3 2 2
»size(ipermute(D.[2 1 3]))
ans=
2 2 3
» ipermute(permute(D,[3 2 1]),[3 2 1])
1 2
3 4
ans(:. :,2) =
5 6
78
ans(:.:,3) =
9 10
11 12
Понятие о многомерных массивах
Понятие о многомерных массивах
В MATLAB двумерный массив является частным случаем многомерного массива. Многомерные массивы характеризуются размерностью более двух. Таким массивам можно дать наглядную интерпретацию. Так, матрицу (двумерный массив) можно записать на одном листе бумаги в виде строк и столбцов, состоящих из элементов матрицы. Тогда блокнот с такими листками можно считать трехмерным массивом, полку в шкафу с блокнотами — четырехмерным массивом, шкаф со множеством полок — пятимерным массивом и т. д. В этой книге практически нигде, кроме этого раздела, мы не будем иметь дело с массивами, размерность которых выше двух, но знать о возможностях MATLAB в части задания и применения многомерных массивов все же полезно.
В нашей литературе понятия «размер» и «размерность» массивов являются почти синонимами. Однако они имеют явно разный смысл в данной книге, как и в документации и литературе по системе MATLAB. Под
размерностью
массивов понимается число измерений в пространственном представлении массивов, а под
размером —
число строк и столбцов (mxn) в каждой размерности массива.
Применение оператора «:» в многомерных массивах
Применение оператора «:» в многомерных массивах
При обычном задании массивов (с помощью символа точки с запятой «;») число рядов (строк) массива получается на 1 больше, чем число символов «:», но массив остается двумерным. Оператор «:» (двоеточие) позволяет легко выполнять операции по увеличению размерности массивов. Приведем пример формирования трехмерного массива путем добавления новой страницы. Пусть у нас задан исходный двумерный массив М размером 3x3:
» М=[1 2 3; 4 5 6; 7 8 9]
М =
1 2 3
4 5 6
7 8 9
Для добавления новой страницы с тем же размером можно расширить М следующим образом:
» М(:.:.2)=[10 11 12; 13 14 15; 16 17 18]
M(:.:.l) =
1 2 3
4 5 6
7 8 9
М(:.:.2) =
10 11 12
13 14 15
16 17 18
Посмотрим, что теперь содержит массив М при явном его указании:
» М
М(:,:.1)=
1 2 3
4 5 6
7 8 9
М(:.:.2) =
10 11 12
13 14 15
16 17 18
Как можно заметить, числа в выражениях М(:.:, 1) и М(:,: ,2) означают номер страницы.
Сдвиг размерностей массивов
Сдвиг размерностей массивов
Сдвиг размерностей реализуется функцией shiftdim:
B=shiftdim(X,N) — сдвиг размерностей в массиве X на величину N. Если М>0, то сдвиг размерностей, расположенных справа, выполняется влево, а N первых слева размерностей сворачиваются в конец массива, т. е. движение размерностей идет по кругу против часовой стрелки. Если М<0, сдвиг выполняется вправо, причем N первых размерностей, сдвинутых вправо, замещаются единичными размерностями;
[B,NSHIFTS]=shiftdim(X) — возвращает массив В с тем же числом элементов, что и у массива X, но с удаленными начальными единичными размерностями. Выходной параметр NSHIFTS показывает число удаленных размерностей. Если X — скаляр, функция не изменяет X , В, NSHIFTS.
Следующий пример иллюстрирует применение функции shiftdim:
» A=randn(1,2,3,4);
» [B,N]=shiftdim(A)
B(:.:.1) =
-2.1707-1.01060.5077
-0.05920.6145 1.6924
B(:.:,2) =
0.5913 0.3803 -0.0195
-0.6436-1.0091-0.0482
B(:.:.3) =
0.0000 1.0950 0.4282
-0.3179-1.87400.8956
В(:.:,4) =
0.7310 0.0403 0.5689
0.5779 0.6771 -0.2556
N =
1
Создание страниц, заполненных константами и случайными числами
Создание страниц, заполненных константами и случайными числами
Если после знака присваивания стоит численная константа, то соответствующая часть массива будет содержать элементы, содержащие данную константу. Например, создадим из массива М (см. пример выше) массив, у которого вторая страница содержит единицы:
»M(:.:..2)=1
М(:.:,1) =
10 11 12
13 14 15
16 17 18
М(:.:.2) =
1 1 1
1 1 1
1 1 1
А теперь заменим первую страницу массива на страницу с нулевыми элементами:
»M(:.:.1)=0
M(:.:.1)=
0 0 0
0 0 0
0 0 0
М(:.:,2) =
1 1 1
1 1 1
1 1 1
Удаление единичных размерностей
Удаление единичных размерностей
Функция squeeze(A) возвращает массив, в котором удалены все единичные размерности. Единичной называется размерность, в которой size(A. dim) == 1. Но если
А — одномерный или двумерный массив (матрица или вектор), то функция вернет тот же самый массив А. Следующий пример поясняет работу squeeze:
» A=randn(1.2.1.3.1);
» B=squeeze(A)
В=
0.6145 1.6924 -0.6436
0.5077 0.5913 0.3803
Обратите внимание на то, что пятимерный массив А превращается в массив с размерностью 2 и размером 2x3.
Удаление размерности в многомерном массиве
Удаление размерности в многомерном массиве
Мы уже отмечали возможность удаления отдельных столбцов присвоением им значений пустого вектора-столбца [ ]. Этот прием нетрудно распространить на страницы и вообще размерности многомерного массива. Например, первую страницу полученного массива М можно удалить следующим образом:
» М(:.:.1)=[ ]
М =
10 11 12
13 14 15
16 17 18
Нетрудно заметить, что в этом массиве осталась только вторая страница и что размерность массива уменьшилась на 1 — он стал двумерным.
Многомерные массивы
Урок 13. Многомерные массивы Понятие о многомерных массивах Применение оператора ":" в многомерных массивах Доступ к отдельному элементу многомерного массива Удаление размерности в многомерном массиве Создание страниц, заполненных константами и случайными числами Использование функций ones, zeros, rand и randn Объединение массивов Работа с размерностями Вычисление числа размерностей массива Вычисление размера размерности массива Перестановки размерностей массивов Сдвиг размерностей массивов Удаление единичных размерностей Что нового мы узнали?
Вычисление числа размерностей массива
Вычисление числа размерностей массива
Функция ndims(A) возвращает размерность массива А (если она больше или равна двум). Но если входной аргумент — массив Java или массив массивов Java, то независимо от размерности массива эта функция вернет 2. Следующий пример иллюстрирует применение функции ndims:
» M=rand(2:3:4:5):
» ndims(M)
ans =
4
Вычисление размера размерности массива
Вычисление размера размерности массива
Для вычисления размера каждой размерности массива используется функция size:
М = size(A.DIM) возвращает размер размерности, указанной скаляром DIM, в виде вектора-строки размером 2. Для двумерного или одномерного массива А size(A.l) возвращает число рядов, a size (А, 2) - число столбцов;
Для N-мерных массивов А при n>2 size(A) возвращает N-мерный вектор-строку, отражающий страничную организацию массива, последняя составляющая этого вектора равна N. В векторе отсутствуют данные о единичных размерностях (тех, где расположены вектор-строка или вектор-столбец, т. е. size(A,DIM)==l). Исключение представляют N-мерные массивы Java массивов javaarray, которые возвращают размер массива самого высокого уровня.
Вообще, когда входным аргументом size является javaarray, то возвращаемое число столбцов всегда 1, а число рядов (строк) равно размеру (длине) javarray.
[Ml, М2 ,МЗ,..., MN] = si ze(A) возвращает размер первых N размерностей массива А;
D = size (А), для mxn матрицы А возвращает двухэлементный вектор-строку, в котором первая составляющая — число строк т, а вторая составляющая — число столбцов n;
[m.n] = size(A) возвращает число рядов и столбцов в разных выходных параметрах (выходных аргументах в терминологии MATLAB) тип.