Следующий код строит линейный индекс как сумму двух частей:
- «внешний» шаблон, описывающий структуру блоков (генерируется с помощью
repelem
),и - «внутренний» шаблон со структурой повторяющегося блока (с использованием
repmat
).
Применение этого индекса к исходной матрице даетжелаемый результат.
data = cat(3, [1 2; 3 4], [5 6; 7 8], [9 10; 11 12]); % example data
[L, M, N] = size(data);
ind_outer = repelem(mod(bsxfun(@minus, 0:N-1, (0:N-1).'), N), L, M);
ind_inner = repmat(reshape(1:L*M, L, M), N, N);
ind = ind_outer*L*M + ind_inner;
result = data(ind);
Это дает
result =
1 2 5 6 9 10
3 4 7 8 11 12
9 10 1 2 5 6
11 12 3 4 7 8
5 6 9 10 1 2
7 8 11 12 3 4
Чтобы лучше понять, как это работает, посмотрите шаблоны внешнего и внутреннего индексирования (и, если необходимо, прочитайте о линейном индексировании ):
>> ind_outer
ind_outer =
0 0 1 1 2 2
0 0 1 1 2 2
2 2 0 0 1 1
2 2 0 0 1 1
1 1 2 2 0 0
1 1 2 2 0 0
>> ind_inner
ind_inner =
1 3 1 3 1 3
2 4 2 4 2 4
1 3 1 3 1 3
2 4 2 4 2 4
1 3 1 3 1 3
2 4 2 4 2 4