到目前为止,我已经声明了一个大小为88x88的随机矩阵M应该是uint8 (所有值都应该在0到255之间)。将矩阵分解为4部分: p1、p2、p3、p4将所有部分连接成新的矩阵N。
发布于 2014-11-14 08:40:22
你的问题不太清楚,也许这有帮助,
M = uint8(randi([0 255],[88 88]));
p1 = M(1:end/2 ,1:end/2 );
p2 = M(1:end/2 ,end/2+1:end);
p3 = M(end/2+1:end,1:end/2 );
p4 = M(end/2+1:end,end/2+1:end);
N = [p1' p2';p3' p4'];发布于 2014-11-14 08:46:57
方法1
如果您有图像处理工具箱,您可以使用blockproc对此使用非常直接的解决方案-
fun = @(block_struct) transpose(block_struct.data);
N = blockproc(M, [size(M,1)/2 size(M,2)/2], fun)方法2
让我们假设您有一个大小为m x n的输入矩阵,并且希望将其划分为沿行的dim1p部分和沿列的dim2p部分,这样每个块的大小都是m/dim1p x n/dim2p,您希望将它们转换,最后将它们连接起来,形成一个2D数组。这可以被认为是你在问题中提议的一个general case。
要想解决这样的问题,你可以用这个-
[m,n] = size(M); %// Get size
dim1p = 2; %// number of parts to be partitioned along dimension-1 (rows)
dim2p = 2; %// number of parts to be partitioned along dimension-2 (columns)
%// Split and transpose, resulting in a 3D array
A = reshape(permute(reshape(M, m, n/dim2p, []), [2 1 3]), n/dim2p, m/dim1p, []);
%// Join the 3D slices back into a 2D array for the desired output
nrows = n*dim1p/dim2p;
N = reshape(permute(reshape(permute(A,[1 3 2]),nrows,dim2p,[]),[1 3 2]),nrows,[])示例运行(假设M为9 x 8大小,并将其划分为行和列的3和4部分,以便每个块的大小为3 x 2) -
M =
5 6 2 6 4 2 1 3
2 8 8 1 3 8 3 7
5 1 6 8 4 1 6 8
6 5 7 3 3 6 7 1
4 3 9 3 2 2 5 3
4 9 5 7 6 2 2 1
7 6 2 5 9 3 5 6
8 9 5 6 9 6 7 1
1 1 3 3 4 9 1 3
dim1p =
3
dim2p =
4
N =
5 2 5 2 8 6 4 3 4 1 3 6
6 8 1 6 1 8 2 8 1 3 7 8
6 4 4 7 9 5 3 2 6 7 5 2
5 3 9 3 3 7 6 2 2 1 3 1
7 8 1 2 5 3 9 9 4 5 7 1
6 9 1 5 6 3 3 6 9 6 1 3发布于 2014-11-14 14:53:25
另一种方法是使用mat2cell将矩阵分割成一个由2x2个单元格组成的网格,使用cellfun转换每个单元格的内容,然后使用cell2mat将它们全部拼接在一起。因此:
[rows, cols] = size(M);
C = mat2cell(M, [rows/2, rows/2], [cols/2, cols/2]);
D = cellfun(@transpose, C, 'uni', 0);
out = cell2mat(D);次要注意事项:这只在行和列都是偶数时才能工作。
https://stackoverflow.com/questions/26925785
复制相似问题