将矩阵划分为块矩阵

partition a matrix into matrix of blocks

我想将图像数据分成块,例如,如果我有 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 循环,我想要矢量代码,那么重塑之后下一步该做什么?

编辑

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

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)

我做错了什么?

对于初始情况 (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]);