Matlab不同尺寸2D矩阵拼接为3D矩阵维度报错解决方法
问题根源
Matlab原生数值类高维数组要求所有第三维切片的行列尺寸严格一致。你的代码第一次迭代执行FinalM(:,:,Set) = M时,会自动把FinalM的尺寸固定为1200×162×N,后续迭代赋值时右侧矩阵必须匹配这个尺寸,传入1200×159的矩阵必然触发维度不匹配报错。
可选解决方法
根据你实际的输出需求选对应方案即可:
方案1:横向拼接为2D矩阵
如果你不需要保留第三维结构,只是要把所有迭代生成的矩阵按列拼合,直接用水平拼接语法即可,不需要做维度对齐:FinalM = []; for Set=1:3 if Set == 1 || Set == 2 M = zeros(1200,162); else M = zeros(1200,159); end FinalM = [FinalM, M]; end运行后得到的
FinalM尺寸为1200×483,对应三次矩阵列数之和。方案2:补零对齐保留3D数组结构
如果你确实需要3D数组结构,先取所有迭代矩阵的最大列数作为3D数组的固定第二维长度,给列数不足的矩阵末尾补零后再赋值:maxCol = 162; % 所有迭代中矩阵的最大列数,可提前统计 FinalM = zeros(1200, maxCol, 3); % 按统一尺寸预分配内存 for Set=1:3 if Set == 1 || Set == 2 M = zeros(1200,162); currCol = 162; else M = zeros(1200,159); currCol = 159; end FinalM(:, 1:currCol, Set) = M; % 仅对有效列赋值,缺失位置自动补0 end运行后得到的
FinalM尺寸为1200×162×3,第三个切片最后3列为补全的零值,不覆盖原有有效数据。方案3:元胞数组存储无需对齐
如果你不想补零修改原始数据结构,直接用元胞数组存储每次迭代的结果即可,元胞的每个元素支持任意尺寸的数据类型:FinalM = cell(1,3); for Set=1:3 if Set == 1 || Set == 2 M = zeros(1200,162); else M = zeros(1200,159); end FinalM{Set} = M; end后续调用对应迭代的矩阵时,用大括号索引即可,比如取第三次迭代的矩阵写
FinalM{3}。
你代码注释中标注的期望输出尺寸1200×362×3为笔误:三次矩阵列数求和为483,按最大列对齐的3D数组第二维长度为162,均不存在362的维度值。
内容的提问来源于stack exchange,提问作者labgeek
相关产品推荐
相关产品推荐

