我正在尝试将一个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 21:29:09
您可以创建一个平铺索引矩阵,然后使用它来获得3*3个数组
idx = repelem( reshape(1:9,3,3), 3, 3 );
out = arrayfun( @(x) reshape(A(idx==x),3,3), 1:9, 'uni', 0 );解释:
idx是一个平铺数组,如下所示:
idx =
1 1 1 4 4 4 7 7 7
1 1 1 4 4 4 7 7 7
1 1 1 4 4 4 7 7 7
2 2 2 5 5 5 8 8 8
2 2 2 5 5 5 8 8 8
2 2 2 5 5 5 8 8 8
3 3 3 6 6 6 9 9 9
3 3 3 6 6 6 9 9 9
3 3 3 6 6 6 9 9 9然后,arrayfun行遍历值1 .. 9,并提取idx与循环的索引值匹配的矩阵。我们必须在这里使用最终的reshape,因为逻辑索引将数组转换为1D。
输出是一个9x1单元数组,其中每个单元都是一个子矩阵。
https://stackoverflow.com/questions/63463362
复制相似问题