我需要一些帮助以通过以下方式将 2X2 矩阵转换为 4X4 矩阵:
A = [2 6;
8 4]
应该变成:
B = [2 2 6 6;
2 2 6 6;
8 8 4 4;
8 8 4 4]
我该怎么做?
可以比 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( ceil( 0.5:0.5:end ), ceil( 0.5:0.5:end ) );
它使用索引来做所有事情,并且不依赖于 A 的大小或形状。
这有效:
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]);
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!
这是一种基于简单索引的方法,适用于任意矩阵。我们希望将每个元素扩展为一个 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])