如何在MATLAB中将2X2矩阵转换为4X4矩阵?

时间:2009-10-29 12:47:59

标签: matlab matrix repeat tiling

我需要一些帮助,以下列方式将2X2矩阵转换为4X4矩阵:

A = [2 6;
     8 4]

应该成为:

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

我该怎么做?

7 个答案:

答案 0 :(得分:23)

在较新版本的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

答案 1 :(得分:12)

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

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

答案 2 :(得分:9)

这是另一个解决方案:

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

使用索引来完成所有操作,而不依赖于A的大小或形状。

答案 3 :(得分: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解决方案的Springboarding,我认为这可能是最短且最清晰的解决方案:

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

答案 4 :(得分:2)

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!

答案 5 :(得分:2)

这是一种基于简单索引的方法,适用于任意矩阵。我们希望每个元素都扩展为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])

答案 6 :(得分:-4)

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

例如:

reshape(array, [64, 16])

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

干杯