我需要在一个2X2矩阵转换成以下方式4x4矩阵一些帮助:
A = [2 6;
8 4]
应该变成:
B = [2 2 6 6;
2 2 6 6;
8 8 4 4;
8 8 4 4]
我会怎么做呢?
我需要在一个2X2矩阵转换成以下方式4x4矩阵一些帮助:
A = [2 6;
8 4]
应该变成:
B = [2 2 6 6;
2 2 6 6;
8 8 4 4;
8 8 4 4]
我会怎么做呢?
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!
在MATLAB(R2015a及更高版本)要做到这一点最简单的方法的较新版本使用repelem
功能:
B = repelem(A, 2, 2);
对于旧版本,其他(主要是)基于索引的解决方案很短的替代方案是使用功能kron
和ones
:
>> 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的解决方案更容易:
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');
这是从X A(X,Y)的只是二维最近邻插值,Y∈{1,2}的x,y∈{0.5,1,1.5,2}。
编辑 :Springboarding掉杰森S和马亭的解决方案,我想这大概是最短和最明确的解决方案:
A = [2 6; 8 4];
B = A([1 1 2 2], [1 1 2 2]);
下面是基于简单的索引的方法,对于任意矩阵的作品。 我们希望每一个元素被扩展到M×N的子矩阵:
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
最后,索引的阵列的情况下,“结束”的关键字的计算结果为在相应尺寸的阵列的大小。 其结果是,在以下的例子中是等效的:
>> 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])
有一种重塑()函数,可以让你做到这一点...
例如:
reshape(array, [64, 16])
你可以找到一个伟大的视频教程在这里
干杯