我正在尝试将一个9x9矩阵分解成9个3x3矩阵。我已经使用了命令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
我需要它的形式
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...
这段代码完全按照我需要的方式生成矩阵,但只保存最后一个:
for i=[1 4 7]
for j=[1 4 7]
v(:,:)=M([i:i+2],[j:j+2])
end
end
发布于 2020-08-18 15:16:15
您在每次循环迭代中创建一个大小为3x3的新v
,即覆盖它。您可以轻松地添加第三维,并将所有单独的矩阵存储在那里:
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
其他一些注意事项:
size(M)
的代码,这样您就可以轻松地将M
扩展到更大的尺寸。i
或j
作为索引/变量名,as they denote the imaginary unit。使用这些工具很容易导致难以调试的错误。ii:ii+2
已是数组,添加方括号是多余的v
,即在进入循环之前告诉MATLAB它将有多大。否则,MATLAB将不得不在每次迭代中增加其大小,这是非常缓慢的。这称为preallocation.n
和m
显然需要是整数,但不仅如此。您需要整数个子矩阵来填充每个维度,即size(M,1)/n
和size(M,2)/m
都需要是整数。如果不是这样,则此代码将在初始化v
.时出错
发布于 2020-08-18 15:56:48
您也可以使用mat2cell
函数。您需要声明input_size
和chunk_size
。然后,您需要在每个维度中声明块的数量(sc
变量)。
例如:
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];
% Z = zeros(size(M, 1), size(M, 2));
input_size = size(M);
chunk_size = [3 3];
sc = input_size ./ chunk_size;
C = mat2cell(M, chunk_size(1)*ones(sc(1), 1),...
chunk_size(2)*ones(sc(2), 1));
celldisp(C')
输出:
ans{1,1} =
0 0 0
0 2 0
0 3 8
ans{2,1} =
0 0 0
9 0 0
0 5 4
ans{3,1} =
0 7 6
0 0 0
1 0 0
ans{1,2} =
9 0 0
0 0 0
4 0 0
ans{2,2} =
5 0 0
0 1 8
0 0 0
ans{3,2} =
0 3 0
0 6 7
2 0 0
ans{1,3} =
0 1 0
0 0 0
6 0 2
ans{2,3} =
8 0 0
0 0 7
0 3 0
ans{3,3} =
0 5 0
0 0 0
8 9 4
发布于 2020-08-18 19:41:42
仅使用线性索引和隐式扩展:
% Random example matrix
M = randi(9,[9,12])
% Block size
n = 3;
% Indexing
s = size(M,1)
ind = [1:n].'+[0:n-1]*s+reshape(floor((0:n:(numel(M)/n)-1)/s)*n*s+mod(1:n:numel(M)/n,s)-1,1,1,[])
% Split each block into a third dimension.
B = M(ind)
其中:
[1:n].'+[0:n-1]*s =
1 10 19
2 11 20
3 12 21
% The linear index of the first block
和:
reshape(floor((0:n:(numel(M)/n)-1)/s)*n*s+mod(1:n:numel(M)/n,s)-1,1,1,[]) =
ans(:,:,1) = 0
ans(:,:,2) = 3
ans(:,:,3) = 6
ans(:,:,4) = 27
ans(:,:,5) = 30
ans(:,:,6) = 33
ans(:,:,7) = 54
...
% The shifting number for each block
请注意,矩阵M
的每个维度的长度必须能被n
整除
https://stackoverflow.com/questions/63463362
复制相似问题