将矩阵划分为块矩阵

时间:2015-05-18 11:05:32

标签: arrays matlab matrix multidimensional-array submatrix

我想将图像数据分成块,例如,如果我有4 * 4的X矩阵,我希望结果是2 * 2 * 2 * 2的矩阵M,其中M(1,1,: ,:)= X(1:2,1:2)和M(1,2,:,:) = X(1:2,3:4)等。

我发现了一种使用mat2cell将其划分为单元格数组的方法,但是matlab中的单元数组似乎不太受支持,我搜索并询问SO只是为了做一些可以用普通矩阵轻松完成的事情(我得到了答案建议)根本不使用单元格数组。

我彻底搜索了网络,有很多结果,所有这些都解决了一个特定的问题(比如找到一个方程的解决方案,我不想在这里)或最终建议mat2cell。

我发现最接近的结果是使用重塑,我尝试reshape(X,[2 2 2 2])并得到C = 2 * 2 * 2 * 2矩阵,但C(1,1,:,:)似乎是第一行X不是第一个块,我无法弄清楚下一步该做什么。

有人建议permute(C,[1 2 3 4]),但我仍然没有得到我想要的结果。

我仍然是matlab的初学者所以请原谅我,如果我的问题很简单,我也不想要for-loops,我想要矢量代码,那么重塑之后该怎么做?

修改

我尝试了这个重复问题的答案,但仍然没有得到我想要的结果,我尝试了这些:

A=ones(40,40);
A(1:10,1:10)=32*ones(10,10);
A(11:20,1:10)=zeros(10,10);    
T = permute(reshape(A, size(A, 1), 10, []), [2 1 3]);  
T = permute(reshape(T, 10, 10, [], size(T, 3)), [2 1 3 4]); 

T是10 * 10 * 4 * 4,正好是我想要的尺寸(40 * 40到子矩阵矩阵中每个4 * 4)但是值是错误的,T(1,1,:,:)~=A(1:4,1:4)

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

对于初始案例(4x4 into 2x2x2x2x2),请使用

M= permute(reshape(X',[2,2,2,2]),[4,2,3,1]);

对于size(X) = a x b)size(M) = c x d x e x f这样a*b = c*d*e*f的一般情况,对于任何自然数n,请使用

M= permute(reshape(X',[c,d,e,f]),[4,2,3,1]);