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
循环无法实现。有没有办法实现上述目的而没有循环?我考虑过其他可能利用上下三角形矩阵的方法,但是即使在某些时候,这些方法似乎也需要循环。任何帮助表示赞赏!
这是一个方法:
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
。