沿对角线子集对称矩阵

J.A*_*vra 5 arrays matlab matrix

我有一个8x8的矩阵,例如A=rand(8,8)。我需要做的是沿对角线对所有2x2矩阵进行子集化。这意味着,我需要保存矩阵A(1:2,1:2)A(3:4,3:4)A(5:6,5:6)A(7:8,7:8)。为了更好地说明自己,我使用的当前版本如下:

 AA = rand(8,8);
 BB = zeros(8,2);
 for i = 1:4
     BB(2*i-1:2*i,:) = AA(2*i-1:2*i,2*i-1:2*i);
 end
Run Code Online (Sandbox Code Playgroud)

这适用于小型AA矩阵和小型AA子矩阵,但是随着大小的显着增长(甚至可能达到50,000x50,000),使用上述for循环无法实现。有没有办法实现上述目的而没有循环?我考虑过其他可能利用上下三角形矩阵的方法,但是即使在某些时候,这些方法似乎也需要循环。任何帮助表示赞赏!

Lui*_*ndo 2

这是一个方法:

AA = rand(8,8); % example matrix. Assumed square
n = 2; % submatrix size. Assumed to divide the size of A
mask = repelem(logical(eye(size(AA,1)/n)), n, n);
BB = reshape(permute(reshape(AA(mask), n, n, []), [1 3 2]), [], n);
Run Code Online (Sandbox Code Playgroud)

这会生成一个逻辑掩码,用于选择所需的元素,然后使用reshape和根据需要重新排列它们permute