Как напечатать циркуляционную матрицу (toeplitz) в MATLAB, где каждый вход является трехмерной матрицей размера mxmx 3? - PullRequest
1 голос
/ 06 июля 2019

Я знаю, как использовать функцию toeplitz в MATLAB для создания циркулянтной матрицы 1 D вектора.Тем не менее, я пытаюсь создать циркулянтный блок

Например, у меня есть 3 матрицы размера (2,2,3), где третье измерение R, G, B: Ниже я показываю пример значенийстрока и столбец каждой матрицы.Первая матрица:

# 01  02
# 03  04

Вторая матрица:

# 05  06
# 07  08

Третья матрица:

# 09  10
# 11  12

Теперь я хочу создать циркулянтную матрицу, которая выглядит следующим образом

# 01  02  05  06  09  10
# 03  04  07  08  11  12
# 09  10  01  02  05  06
# 11  12  03  04  07  08
# 03  04  09  10  01  02
# 05  06  11  12  03  04

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

Может кто-нибудь сказать мне, как это сделать?Я думал о создании массива У меня уже есть 3D-матрица, и я не знаю, как сделать массив из массива здесь, если это вообще поможет.

Ссылки:

1 Ответ

0 голосов
/ 07 июля 2019

Следующий код строит линейный индекс как сумму двух частей:

  • «внешний» шаблон, описывающий структуру блоков (генерируется с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...