You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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]); % 交换前两个维度得到正确切片

原理解释:

  1. a.'把原6×3数组转置为3×6,此时原数组的每一行变成了转置数组的每一列;
  2. reshape(a.', 3, 3, 2)把3×6的数组拆分成两个3×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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:21:50