如何将 9x9 矩阵分解为 3x3 矩阵?

Dav*_* BG 4 matlab matrix

我正在尝试将 9x9 矩阵分解为 9 个 3x3 矩阵。我已经使用了 command reshape,但它返回的矩阵是将 9x9 矩阵的列转换为 3x3 矩阵的矩阵,但这不是我需要的。这是 9x9 矩阵 M

0   0   0   0   0   0   0   7   6
0   2   0   9   0   0   0   0   0
0   3   8   0   5   4   1   0   0
9   0   0   5   0   0   0   3   0
0   0   0   0   1   8   0   6   7
4   0   0   0   0   0   2   0   0
0   1   0   8   0   0   0   5   0
0   0   0   0   0   7   0   0   0
6   0   2   0   3   0   8   9   4
Run Code Online (Sandbox Code Playgroud)

我需要它的形式

0 0 0    0 0 0    0 7 6
0 2 0    9 0 0    0 0 0
0 3 8    0 5 4    1 0 0       etc...
Run Code Online (Sandbox Code Playgroud)

这段代码完全按照我的需要生成矩阵,但只保存最后一个:

for i=[1 4 7]
    for j=[1 4 7]
        v(:,:)=M([i:i+2],[j:j+2])
    end
end
Run Code Online (Sandbox Code Playgroud)

Adr*_*aan 5

You make a new v of size 3x3 every loop iteration, i.e. you overwrite it. What you can easily do is to add a third dimension, and store all your separate matrices along there:

n = 3;  % Amount of rows of the sub-matrices
m = 3;  % Amount of columns of the sub-matrices
v = zeros(size(M,1)./n,size(M,2)./m,(size(M,1)*size(M,2))./(n*m)); % Initialise v

kk = 1;  % Initialise page counter
for ii = 1:n:size(M,1)
    for jj = 1:m:size(M,2)
        v(:,:,kk) = M(ii:ii+2, jj:jj+2); % Save on page kk
        kk = kk+1;  % Increase page counter
    end
end
Run Code Online (Sandbox Code Playgroud)

A few other notes:

  • In order to generalise the code I used size(M) everywhere, such that you can easily extend M to larger sizes.

  • 不要使用ij作为索引/变量名称,因为它们表示虚数单位。使用这些很容易导致难以调试的错误。

  • ii:ii+2 已经是一个数组,添加方括号是多余的

  • 初始化v,即在进入循环之前告诉 MATLAB 它将有多大。否则,MATLAB 每次迭代都必须增加其大小,这非常慢。这称为预分配

  • nm显然必须是整数,但不仅如此。您需要子矩阵的整数金额来填补每一个维度,即size(M,1)/nsize(M,2)/m都需要是整数。如果不是这种情况,此代码将在v.