【问题标题】:How do I convert a 2X2 matrix to 4X4 matrix in MATLAB?如何在 MATLAB 中将 2X2 矩阵转换为 4X4 矩阵?
【发布时间】:2026-02-24 19:40:01
【问题描述】:

我需要一些帮助才能通过以下方式将 2X2 矩阵转换为 4X4 矩阵:

A = [2 6;
     8 4]

应该变成:

B = [2 2 6 6;
     2 2 6 6;
     8 8 4 4;
     8 8 4 4]

我该怎么做?

【问题讨论】:

    标签: matlab matrix repeat tiling


    【解决方案1】:

    在较新版本的 MATLAB(R2015a 及更高版本)中,最简单的方法是使用 repelem 函数:

    B = repelem(A, 2, 2);
    

    对于旧版本,其他(主要)基于索引的解决方案的一个简短替代方案是使用函数kronones

    >> A = [2 6; 8 4];
    >> B = kron(A, ones(2))
    
    B =
    
         2     2     6     6
         2     2     6     6
         8     8     4     4
         8     8     4     4
    

    【讨论】:

    • 更短,虽然为了泛化到大型矩阵,有可能会减慢速度的不必要的乘法。
    • @Jason S:是的,但是对于更大的矩阵,您还必须做更多的工作来生成此处其他解决方案所需的索引。
    【解决方案2】:

    可以比 Jason 的解决方案更容易完成:

    B = A([1 1 2 2], :);  % replicate the rows
    B = B(:, [1 1 2 2]);  % replicate the columns
    

    【讨论】:

    • 单线:A = [2 6; 8 4]; B = A([1 1 2 2], [1 1 2 2]);
    【解决方案3】:

    这里还有一个解决方案:

    A = [2 6; 8 4];
    B = A( ceil( 0.5:0.5:end ), ceil( 0.5:0.5:end ) );
    

    它使用索引来做所有事情,不依赖于 A 的大小或形状。

    【讨论】:

    • 这很奇怪!不知何故,“end”关键字知道矩阵 A,即使它是 ceil() 的参数。我不知道它是如何工作的,但确实如此。
    • 我也不知道它是怎么做到的,但它很方便!
    • 疯狂、丑陋和最美的同时解决
    【解决方案4】:

    这行得通:

    A = [2 6; 8 4];
    [X,Y] = meshgrid(1:2);
    [XI,YI] = meshgrid(0.5:0.5:2);
    B = interp2(X,Y,A,XI,YI,'nearest');
    

    这只是 A(x,y) 从 x,y ∈ {1,2} 到 x,y ∈ {0.5, 1, 1.5, 2} 的二维最近邻插值。

    编辑:跳出 Jason S 和 Martijn 的解决方案,我认为这可能是最短和最清晰的解决方案:

    A = [2 6; 8 4];
    B = A([1 1 2 2], [1 1 2 2]);
    

    【讨论】:

    • 这适用于任何通用 2X2 矩阵还是仅适用于该 2X2 矩阵。
    【解决方案5】:
    A = [2 6; 8 4];
    % arbitrary 2x2 input matrix
    
    B = repmat(A,2,2);
    % replicates rows & columns but not in the way you want
    
    B = B([1 3 2 4], :);
    % swaps rows 2 and 3
    
    B = B(:, [1 3 2 4]);
    % swaps columns 2 and 3, and you're done!
    

    【讨论】:

    • 不错!我认为应该有一些方法可以通过 repmat 和列和行交换来做到这一点,但我的大脑仍然半睡半醒。
    • gnovice 使用 Kroneker KRON 函数的解决方案更好——更直接明了——“故意编程”
    • 我更喜欢 Martijn 的回答,但这只是我自己。
    • 关于所有基于索引的解决方案,我实际上更喜欢 Edric 的(这是 las3rjock 编辑的通用形式)。
    • 所讨论的数学运算称为“克罗内克积”en.wikipedia.org/wiki/Kronecker_product。 gnovice 的解决方案直接做到了这一点。其他解决方案,无论多么聪明,都是绕道而行。
    【解决方案6】:

    这是一种基于简单索引的方法,适用于任意矩阵。我们希望将每个元素扩展为一个 MxN 子矩阵:

    A(repmat(1:end,[M 1]),repmat(1:end,[N 1]))
    

    例子:

    >> A=reshape(1:6,[2,3])
    
    A =
    
         1     3     5
         2     4     6
    
    >> A(repmat(1:end,[3 1]),repmat(1:end,[4 1]))
    
    ans =
    
         1     1     1     1     3     3     3     3     5     5     5     5
         1     1     1     1     3     3     3     3     5     5     5     5
         1     1     1     1     3     3     3     3     5     5     5     5
         2     2     2     2     4     4     4     4     6     6     6     6
         2     2     2     2     4     4     4     4     6     6     6     6
         2     2     2     2     4     4     4     4     6     6     6     6
    

    要了解该方法的工作原理,让我们仔细看看索引。我们从一个简单的连续数字行向量开始

    >> m=3; 1:m
    
    ans =
    
         1     2     3
    

    接下来,我们将其扩展为一个矩阵,在第一维重复 M 次

    >> M=4; I=repmat(1:m,[M 1])
    
    I =
    
         1     2     3
         1     2     3
         1     2     3
         1     2     3
    

    如果我们使用矩阵来索引数组,那么矩阵元素按照标准的 Matlab 顺序连续使用:

    >> I(:)
    
    ans =
    
         1
         1
         1
         1
         2
         2
         2
         2
         3
         3
         3
         3
    

    最后,在索引数组时,'end' 关键字计算出数组在相应维度中的大小。因此,在示例中,以下内容是等价的:

    >> A(repmat(1:end,[3 1]),repmat(1:end,[4 1]))
    >> A(repmat(1:2,[3 1]),repmat(1:3,[4 1]))
    >> A(repmat([1 2],[3 1]),repmat([1 2 3],[4 1]))
    >> A([1 2;1 2;1 2],[1 2 3;1 2 3;1 2 3;1 2 3])
    >> A([1 1 1 2 2 2],[1 1 1 1 2 2 2 2 3 3 3 3])
    

    【讨论】:

      【解决方案7】:

      有一个 Reshape() 函数可以让你这样做......

      例如:

      reshape(array, [64, 16])
      

      你可以找到一个很棒的视频教程here

      干杯

      【讨论】:

      • reshape 对此不起作用——它要求输入和输出矩阵具有相同数量的元素。
      • 感谢您的快速,但我认为对于重塑元素的数量不能改变。这里我有一个 2X2 矩阵,即 4 个元素,我想制作一个 4X4 矩阵,所以 16 个元素。元素的数量不同。做什么?
      • 您是否希望通过“重塑”过程在新创建的空间中添加相关元素数据?