我正在尝试将 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)
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.
不要使用i或j作为索引/变量名称,因为它们表示虚数单位。使用这些很容易导致难以调试的错误。
ii:ii+2 已经是一个数组,添加方括号是多余的
初始化v,即在进入循环之前告诉 MATLAB 它将有多大。否则,MATLAB 每次迭代都必须增加其大小,这非常慢。这称为预分配。
n而m显然必须是整数,但不仅如此。您需要子矩阵的整数金额来填补每一个维度,即size(M,1)/n和size(M,2)/m都需要是整数。如果不是这种情况,此代码将在v.