首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将一个9x9矩阵分解成3x3矩阵?

如何将一个9x9矩阵分解成3x3矩阵?
EN

Stack Overflow用户
提问于 2020-08-18 14:58:57
回答 4查看 613关注 0票数 4

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

代码语言:javascript
运行
复制
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

我需要它的形式

代码语言:javascript
运行
复制
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...

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

代码语言:javascript
运行
复制
for i=[1 4 7]
    for j=[1 4 7]
        v(:,:)=M([i:i+2],[j:j+2])
    end
end
EN

回答 4

Stack Overflow用户

发布于 2020-08-18 15:16:15

您在每次循环迭代中创建一个大小为3x3的新v,即覆盖它。您可以轻松地添加第三维,并将所有单独的矩阵存储在那里:

代码语言:javascript
运行
复制
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扩展到更大的尺寸。

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

  • 初始化v,即在进入循环之前告诉MATLAB它将有多大。否则,MATLAB将不得不在每次迭代中增加其大小,这是非常缓慢的。这称为preallocation.

  • nm显然需要是整数,但不仅如此。您需要整数个子矩阵来填充每个维度,即size(M,1)/nsize(M,2)/m都需要是整数。如果不是这样,则此代码将在初始化v.

时出错

票数 5
EN

Stack Overflow用户

发布于 2020-08-18 15:56:48

您也可以使用mat2cell函数。您需要声明input_sizechunk_size。然后,您需要在每个维度中声明块的数量(sc变量)。

例如:

代码语言:javascript
运行
复制
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')

输出:

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2020-08-18 19:41:42

仅使用线性索引和隐式扩展:

代码语言:javascript
运行
复制
%   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)

其中:

代码语言:javascript
运行
复制
[1:n].'+[0:n-1]*s =

     1   10   19
     2   11   20
     3   12   21

% The linear index of the first block

和:

代码语言:javascript
运行
复制
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整除

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63463362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档