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

Многомерный массив в MATLAB® является массивом больше чем с двумя размерностями. В матрице эти две размерности представлены строками и столбцами.

Каждый элемент задан двумя индексами, индексом строки и индексом столбца. Многомерные массивы являются расширением 2D матриц и используют дополнительные индексы для индексации. Трехмерный массив, например, использует три индекса. Первые два точно так же, как матрица, но третья размерность представляет страницы или листы элементов.

Создание многомерных массивов

Можно создать многомерный массив путем создания 2D матрицы сначала, и затем расширения его. Например, сначала задайте 3 3 матрица как первая страница в трехмерном массиве.

A = [1 2 3; 4 5 6; 7 8 9]
A = 3×3

     1     2     3
     4     5     6
     7     8     9

Теперь добавьте вторую страницу. Для этого присвойте другого 3 3 матрица к индексному значению 2 в третьей размерности. Синтаксис A(:,:,2) использует двоеточие в первых и вторых измерениях, чтобы включать все строки и все столбцы с правой стороны присвоения.

A(:,:,2) = [10 11 12; 13 14 15; 16 17 18]
A = 
A(:,:,1) =

     1     2     3
     4     5     6
     7     8     9


A(:,:,2) =

    10    11    12
    13    14    15
    16    17    18

Функция cat может быть полезным инструментом для создания многомерных массивов. Например, создайте новый трехмерный массив B путем конкатенации A с третьей страницей. Первый аргумент указывает который размерность конкатенировать вперед.

B = cat(3,A,[3 2 1; 0 9 8; 5 3 7])
B = 
B(:,:,1) =

     1     2     3
     4     5     6
     7     8     9


B(:,:,2) =

    10    11    12
    13    14    15
    16    17    18


B(:,:,3) =

     3     2     1
     0     9     8
     5     3     7

Иначе быстро расширить многомерный массив путем присвоения единственного элемента целой странице. Например, добавьте четвертую страницу к B, который содержит все нули.

B(:,:,4) = 0
B = 
B(:,:,1) =

     1     2     3
     4     5     6
     7     8     9


B(:,:,2) =

    10    11    12
    13    14    15
    16    17    18


B(:,:,3) =

     3     2     1
     0     9     8
     5     3     7


B(:,:,4) =

     0     0     0
     0     0     0
     0     0     0

Доступ к элементам

К элементам доступа в многомерном массиве используйте целочисленные индексы, как вы были бы для векторов и матриц. Например, найдите 1,2,2 элемента A, который находится в первой строке, втором столбце и второй странице A.

A
A = 
A(:,:,1) =

     1     2     3
     4     5     6
     7     8     9


A(:,:,2) =

    10    11    12
    13    14    15
    16    17    18

elA = A(1,2,2)
elA = 11

Используйте индексный вектор [1 3] во втором измерении, чтобы получить доступ только к первым и последним столбцам каждой страницы A.

C = A(:,[1 3],:)
C = 
C(:,:,1) =

     1     3
     4     6
     7     9


C(:,:,2) =

    10    12
    13    15
    16    18

Чтобы найти вторые и третьи строки каждой страницы, используйте оператор двоеточия, чтобы создать ваш индексный вектор.

D = A(2:3,:,:)
D = 
D(:,:,1) =

     4     5     6
     7     8     9


D(:,:,2) =

    13    14    15
    16    17    18

Управление массивами

Элементы многомерных массивов могут быть перемещены во многих отношениях, подобные векторам и матрицам. reshape, permute и squeeze являются полезными функциями для реконструкции элементов. Рассмотрите трехмерный массив с двумя страницами.

Изменение размерность многомерного массива может быть полезно для выполнения определенных операций или визуализации данных. Используйте функцию reshape, чтобы перестроить элементы трехмерного массива в 6 5 матрица.

A = [1 2 3 4 5; 9 0 6 3 7; 8 1 5 0 2];
A(:,:,2) = [9 7 8 5 2; 3 5 8 5 1; 6 9 4 3 3];
B = reshape(A,[6 5])
B = 6×5

     1     3     5     7     5
     9     6     7     5     5
     8     5     2     9     3
     2     4     9     8     2
     0     3     3     8     1
     1     0     6     4     3

reshape действует по столбцам, создавая новую матрицу путем взятия последовательных элементов вниз каждый столбец A, начиная с первой страницы, затем перемещающейся во вторую страницу.

Перестановки используются, чтобы перестроить порядок размерностей массива. Считайте трехмерный массив M.

M(:,:,1) = [1 2 3; 4 5 6; 7 8 9];
M(:,:,2) = [0 5 4; 2 7 6; 9 3 1]
M = 
M(:,:,1) =

     1     2     3
     4     5     6
     7     8     9


M(:,:,2) =

     0     5     4
     2     7     6
     9     3     1

Используйте функцию permute, чтобы обменяться индексами строки и столбца на каждой странице путем определения порядка размерностей во втором аргументе. Исходные строки M являются теперь столбцами, и столбцы являются теперь строками.

P1 = permute(M,[2 1 3])
P1 = 
P1(:,:,1) =

     1     4     7
     2     5     8
     3     6     9


P1(:,:,2) =

     0     2     9
     5     7     3
     4     6     1

Точно так же обменяйтесь строкой и индексами страницы M.

P2 = permute(M,[3 2 1])
P2 = 
P2(:,:,1) =

     1     2     3
     0     5     4


P2(:,:,2) =

     4     5     6
     2     7     6


P2(:,:,3) =

     7     8     9
     9     3     1

При работе с многомерными массивами вы можете столкнуться с тем, который имеет ненужную размерность длины 1. Функция squeeze выполняет другой тип манипуляции, которая устраняет размерности длины 1. Например, используйте функцию repmat, чтобы создать 2 3 массивом 1 на 4, элементы которого - каждый 5, и чья третья размерность имеет длину 1.

A = repmat(5,[2 3 1 4])
A = 
A(:,:,1,1) =

     5     5     5
     5     5     5


A(:,:,1,2) =

     5     5     5
     5     5     5


A(:,:,1,3) =

     5     5     5
     5     5     5


A(:,:,1,4) =

     5     5     5
     5     5     5

szA = size(A)
szA = 1×4

     2     3     1     4

numdimsA = ndims(A)
numdimsA = 4

Используйте функцию squeeze, чтобы удалить третью размерность, приводящую к трехмерному массиву.

B = squeeze(A)
B = 
B(:,:,1) =

     5     5     5
     5     5     5


B(:,:,2) =

     5     5     5
     5     5     5


B(:,:,3) =

     5     5     5
     5     5     5


B(:,:,4) =

     5     5     5
     5     5     5

szB = size(B)
szB = 1×3

     2     3     4

numdimsB = ndims(B)
numdimsB = 3

Похожие темы

Была ли эта тема полезной?