【问题标题】: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),其中每个输入都是尺寸为 m x m x 3 的 3D 矩阵?
【发布时间】:2019-07-06 01:33:16
【问题描述】:

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

参考资料:

【问题讨论】:

    标签: arrays matlab matrix toeplitz


    【解决方案1】:

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

    • 描述块结构的“外部”模式(使用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
    

    为了更好地理解这是如何工作的,请查看外部和内部索引模式(如果需要,请阅读 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 2013-03-20
      相关资源
      最近更新 更多