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×… .