如何在 MATLAB 中打印循环矩阵 (toeplitz),其中每个输入都是维度为 m x m x 3 的 3D 矩阵?

How to print a circulant matrix (toeplitz), in MATLAB, where each input is a 3D matrix of dimention m x m x 3?

我知道如何使用 MATLAB 中的 toeplitz 函数创建一维向量的循环矩阵。但是,我正在尝试创建一个循环块

例如,我有 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 矩阵,不知道如何在这里制作数组的数组,如果它有帮助的话。

参考文献:

以下代码将线性索引构建为两部分之和:

  • 描述块结构的"outer"模式(用repelem生成),和
  • 具有重复块结构的 "inner" 模式(使用 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

为了更好地理解它是如何工作的,请参阅外部和内部索引模式(如果需要,请阅读 linear indexing):

>> 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