求助:Matlab中如何按水平切片将数组重塑为指定维度
解决按行切片重塑数组的问题
嘿,我完全懂你碰到的这个问题——Matlab的reshape默认是按列主序遍历元素的,这和你想要的按行分组生成三维数组的需求正好拧着来。我来给你几个靠谱的解决方案,帮你得到预期的(3,3,2)数组:
方法1:直接索引赋值(直观易懂)
如果你的数组规模不大,直接手动切片赋值是最清晰的方式,一眼就能看明白逻辑:
a = [1,2,3;4,5,6;7,8,9;10,11,12;13,14,15;16,17,18]; b = zeros(3,3,2); % 先初始化目标数组 b(:,:,1) = a(1:3,:); % 取前3行作为第一个切片 b(:,:,2) = a(4:6,:); % 取后3行作为第二个切片
这种方法没有额外的计算开销,对于大型数组也同样高效,因为本质只是内存地址的映射。
方法2:reshape + permute(自动化分组)
如果你不想手动写索引,或者数组的维度会动态变化,可以结合reshape和permute来实现自动分组:
a = [1,2,3;4,5,6;7,8,9;10,11,12;13,14,15;16,17,18]; temp = reshape(a.', 3, 3, 2); % 先转置数组再重塑 b = permute(temp, [2,1,3]); % 交换前两个维度得到正确切片
原理解释:
a.'把原6×3数组转置为3×6,此时原数组的每一行变成了转置数组的每一列;reshape(a.', 3, 3, 2)把3×6的数组拆分成两个3×3的切片,但此时每个切片的元素是按原数组的列排列的;permute(temp, [2,1,3])交换每个切片的行和列,正好得到你想要的按行分组的结果。
方法3:另一种reshape + permute组合
还有一种更紧凑的写法,通过调整reshape的维度顺序再转置:
a = [1,2,3;4,5,6;7,8,9;10,11,12;13,14,15;16,17,18]; b = permute(reshape(a, 3, 2, 3), [1,3,2]);
这种写法把原数组先重塑为(3,2,3)的中间数组,再通过permute调整维度顺序,最终得到(3,3,2)的目标数组,逻辑同样通顺。
为什么直接用reshape(a,[3,3,2])不行?
Matlab的reshape函数是按列主序(column-major)填充元素的,也就是先遍历完第一列的所有元素,再遍历第二列,以此类推。原数组a的列元素顺序是:
列1:1,4,7,10,13,16
列2:2,5,8,11,14,17
列3:3,6,9,12,15,18
直接reshape(a,[3,3,2])会把这些元素按顺序填充到新数组,得到的第一个切片是:
1 10 2 4 13 5 7 16 8
这显然和你想要的按行分组的结果不符,这就是问题的核心啦。
内容的提问来源于stack exchange,提问作者Mikhail Genkin
相关产品推荐
相关产品推荐

