Урок 13. Многомерные массивы

1. Урок 13. Многомерные массивы

 

Урок №13.

Многомерные массивы

  • Понятие о многомерных массивах

  • Применение оператора «:» в многомерных массивах

  • Доступ к отдельному элементу многомерного массива

  • Удаление размерности в многомерном массиве

  • Создание страниц, заполненных константами и случайными числами

  • Объединение массивов

  • Вычисление числа размерностей массива и определение размера размерностей

  • Перестановки размерностей массивов

  • Сдвиг размерностей массивов 

  • Удаление единичных размерностей

В этом уроке мы коснемся вопросов, связанных с более сложными типами данных, к которым относятся многомерные массивы.

 

2. Понятие о многомерных массивах

 

Понятие о многомерных массивах

В MATLAB двумерный массив является частным случаем многомерного массива. Многомерные массивы характеризуются размерностью более двух. Таким массивам можно дать наглядную интерпретацию. Так, матрицу (двумерный массив) можно записать на одном листе бумаги в виде строк и столбцов, состоящих из элементов матрицы. Тогда блокнот с такими листками можно считать трехмерным массивом, полку в шкафу с блокнотами — четырехмерным массивом, шкаф со множеством полок — пятимерным массивом и т. д. В этой книге практически нигде, кроме этого раздела, мы не будем иметь дело с массивами, размерность которых выше двух, но знать о возможностях MATLAB в части задания и применения многомерных массивов все же полезно.

В нашей литературе понятия «размер» и «размерность» массивов являются почти синонимами. Однако они имеют явно разный смысл в данной книге, как и в документации и литературе по системе MATLAB. Под размерностью массивов понимается число измерений в пространственном представлении массивов, а под размером — число строк и столбцов (mxn) в каждой размерности массива.

 

3. Применение оператора ":" в многомерных массивах

 

Применение оператора «:» в многомерных массивах

При обычном задании массивов (с помощью символа точки с запятой «;») число рядов (строк) массива получается на 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) означают номер страницы.

 

4. Доступ к отдельному элементу многомерного массива

 

Доступ к отдельному элементу многомерного массива

Чтобы вызвать центральный элемент сначала первой, а затем второй страницы, надо записать следующие выражения:

» М(2.2,1) 

ans =

5

» МС2.2.2) 

ans =

14

Таким образом, в многомерных массивах используется то же правило индексации, что и в одномерных и двумерных. Произвольный элемент, например, трехмерного массива задается как М(1 .j.k), где 1 — номер строки, j — номер столбца и k — номер страницы. Этот элемент можно вывести, а можно присвоить ему заданное значение х: М(1 ,j,k)=x.

 

5. Удаление размерности в многомерном массиве

 

Удаление размерности в многомерном массиве

Мы уже отмечали возможность удаления отдельных столбцов присвоением им значений пустого вектора-столбца [ ]. Этот прием нетрудно распространить на страницы и вообще размерности многомерного массива. Например, первую страницу полученного массива М можно удалить следующим образом:

» М(:.:.1)=[ ] 

М =

10 11 12

13 14 15

16 17 18

Нетрудно заметить, что в этом массиве осталась только вторая страница и что размерность массива уменьшилась на 1 — он стал двумерным.

 

6. Создание страниц, заполненных константами и случайными числами

 

Создание страниц, заполненных константами и случайными числами

Если после знака присваивания стоит численная константа, то соответствующая часть массива будет содержать элементы, содержащие данную константу. Например, создадим из массива М (см. пример выше) массив, у которого вторая страница содержит единицы:

»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

 

7. Использование функций 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

Как видно из данного примера, пустой массив возвращается с соответствующим комментарием.

 

8. Объединение массивов

 

Объединение массивов

Для создания многомерных массивов служит описанная ранее для матриц специальная функция конкатенации 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

 

9. Работа с размерностями

 

Работа с размерностями

Вычисление числа размерностей массива

Функция ndims(A) возвращает размерность массива А (если она больше или равна двум). Но если входной аргумент — массив Java или массив массивов Java, то независимо от размерности массива эта функция вернет 2. Следующий пример иллюстрирует применение функции ndims:

» M=rand(2:3:4:5):

» ndims(M) 

ans = 

4

 

10. Вычисление размера размерности массива

 

Вычисление размера размерности массива

Для вычисления размера каждой размерности массива используется функция 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) тип.

 

11. Перестановки размерностей массивов

 

Перестановки размерностей массивов

Если представить многомерный массив в виде страниц, то их перестановка является перестановкой размерностей массива. Для двумерного массива перестановка часто означает транспонирование — замену строк столбцами и наоборот. Следующие функции обобщают транспонирование матриц для случая многомерных массивов и обеспечивают перестановку размерностей многомерных массивов:

  • 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

 

12. Сдвиг размерностей массивов

 

Сдвиг размерностей массивов

Сдвиг размерностей реализуется функцией 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

 

13. Удаление единичных размерностей

 

Удаление единичных размерностей

Функция 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.

 

14. Что нового мы узнали?

 

Что нового мы узнали?

В этом уроке мы научились:

  • Создавать многомерные массивы.

  • Применять оператор «:» в многомерных массивах.

  • Получать доступ к отдельным элементам многомерных массивов.

  • Удалять размерности у многомерного массива.

  • Создавать массивы, заполненные константами и случайными числами.

  • Осуществлять объединение массивов.

  • Вычислять число размерностей массива и определять размер каждой размерности.

  • Переставлять, сдвигать и удалять единичные размерности в многомерных массивах.