 
        
        lection_matlab_all / matlab_7
.pdf 
Работа с многомерными массивами, структурами и массивами ячеек
 
Хотя необходимость в использовании массивов с числом размерностей большей 2 возникает относительно редко, их создание и обработка могут быть сопряжены с довольно громоздкими конструкциями в коде. Для подобных ситуаций MatLab предлагает ряд средств, упрощающих реализацию алгоритмов с многомерными массивами (далее ММ).
 
Примечание: в документации по MatLab под размерностью массивов понимается число измерений в пространственном представлении массивов, а под размером – число элементов в каждой размерности массива.
 
Операция «:» позволяет обращаться к отдельным измерениям ММ, индексируя их как обычные элементы массивов:
>>m = fix(rand(2,2,2)*10);
>>a = m(:,:,1)
a =
98
41
>>b = m(1,:,:)
| b(:,:,1) = | 9 | 8 | 
| b(:,:,2) = | 4 | 7 | 
| >> c = m(1,2,:) | 
 | |
| c(:,:,1) = | 8 | 
 | 
| c(:,:,2) = | 7 | 
 | 
m(:,:,1) =
9 8
41
m(:,:,2) =
4 7
99
В результате этих операций получаются массивы, содержащие элементы, которые «вложены» в соответствующие размерности (или их пересечения) ММ.
 
Оператор «:» также позволяет легко выполнять операции по увеличению размерности массивов путем добавления новых «слоёв». Например:
>>M = [1 2 3; 4 5 6; 7 8 9];
...
>>M(:,:,2)=[10 11 12; 13 14 15; 16 17 18]
| M(:,:,1) = | 
 | 
 | 
 | 
 | 
 | 
 | 
| 1 | 2 | 3 | M = | 1 | 2 | 3 | 
| 4 | 5 | 6 | 4 | 5 | 6 | |
| 
 | 7 | 8 | 9 | |||
| 7 | 8 | 9 | 
 | 
 | 
 | 
 | 
| 
 | 
 | 
 | 
 | |||
| M(:,:,2) = | 
 | 
 | 
 | 
 | 
 | 
 | 
| 10 | 11 | 12 | 
 | 
 | 
 | 
 | 
| 13 | 14 | 15 | 
 | 
 | 
 | 
 | 
| 16 | 17 | 18 | 
 | 
 | 
 | 
 | 
 
Удаление отдельных столбцов, «слоёв» или измерений ММ производится с помощью присвоения им как значения
пустого вектора-столбца []. Например:
>> M(:,:,1)=[ ] M =
| 10 | 11 | 12 | 
| 13 | 14 | 15 | 
| 16 | 17 | 18 | 
| >> size(M) | 
 | |
| ans = | 3 | 
 | 
| 3 | 
 | |
При этом в этом массиве М остался только второй «слой», а его размерность уменьшилась на 1 – он снова стал двумерным.
 
Удаление единичных размерностей производится функцией squeeze(A). Единичной называется размерность, в которой size(A, dim) == 1. Если A – одномерный или двумерный массив, то функция вернет тот же самый массив A. Например
>>A=randn(1, 2, 1, 3, 1);
>>B=squeeze(A)
B =
0.6145 1.6924 -0.6436
0.5077 0.5913 0.3803
 
Для создания ММ из уже имеющихся служит функция конкатенации cat():
C = cat(DIM, A, B) возвращает результат объединения двух массивов A и B вдоль размерности DIM;
B=cat(DIM, A1, A2,…) объединяет множество входных массивов A1, A2,... вдоль размерности DIM.
Примечание: функция cat() обеспечивает также и объединение массивов ячеек или массивов записей(структур).
 
Примеры:
>>M1=[1 2; 3 4]; M2=[5 6; 7 8];
>>cat(1, M1, M2)
| ans = | >> cat(2, M1, M2) | ||
| 1 2 | |||
| 3 4 | ans = | 6 | |
| 5 6 | 1 2 | 5 | |
| 7 8 | 3 4 | 7 | 8 | 
| 
 | >> M=cat(3, M1, M2) | ||
| 
 | M(:,:,1) = | ||
| 
 | 1 2 | 
 | 
 | 
| 
 | 3 4 | 
 | 
 | 
| 
 | M(:,:,2) = | ||
| 
 | 5 6 | 
 | 
 | 
| 
 | 7 8 | 
 | 
 | 
 
Для перегруппировки элементов ММ или преобразования их размеров используется функция reshape() в ряде форм записи:
B = reshape(A, m, n, p, ...)
B = reshape(A, [m n p ...])
Эта функция возвращает многомерный массив (размера m×n×p×…), сформированный из элементов массива A. Основное требование состоит в том, чтобы в А и В было одно и то же число элементов m×n×p×… .
