MATLAB中for循环保存含subplot的图像报错,求解决方案
MATLAB R2020a循环保存含subplot+heatmap图像报错解决
问题场景
在MATLAB R2020a环境下,循环创建包含subplot的图像并保存时触发报错,但保存不含subplot的单张图像时可正常运行。报错提示数组拼接维度不一致,无法定位对应数组。
原代码
clear clc close all %---------------------------- x1 = 1:0.01:3; r = -1 + (1+1)*rand(1,201); x1 = x1 + r; y1 = 1:0.01:3; r = -1 + (1+1)*rand(1,201); y1 = y1 + r; z1 = [1,2,3;4,5,6;7,8,9]; LC = 0 for nn = 1:10 LC = LC+1 figure() subplot(2,1,1) scatter(x1,y1) legend('Data') subplot(2,1,2) xvalues_HM = {'True label 1','True label 2','True label 3'}; yvalues_HM = {'Mdl label 3','Mdl label 2','Mdl label 1'}; h = heatmap(xvalues_HM,yvalues_HM,z1); txtsave = [num2str(LC)]; saveas(gcf,[ txtsave '.png']); close all end
报错信息
Error using alternatePrintPath Dimensions of arrays being concatenated are not consistent. Error in alternatePrintPath Error in print (line 83) pj = alternatePrintPath(pj); Error in saveas (line 181) print( h, name, ['-d' dev{i}] ) Error in script (line 396) saveas(gcf,[ txtsave '.png']);
问题原因
这是MATLAB R2020a的已知Bug:当figure中同时存在subplot和heatmap对象时,saveas/print函数内部处理打印路径时会触发数组维度不匹配的错误,本质是heatmap的渲染逻辑与subplot的布局逻辑冲突导致内部变量拼接失败。
解决方案
提供三种可行修复方案:
方案1:替换saveas为指定参数的print函数
将原代码中的saveas语句替换为:
print(gcf, [txtsave '.png'], '-dpng', '-r300');
通过显式指定输出格式和分辨率,绕过alternatePrintPath的错误逻辑。
方案2:改用tiledlayout替代subplot
tiledlayout是MATLAB R2019b及以后推出的更灵活布局工具,与heatmap兼容性更好。修改循环内的布局代码:
figure() t = tiledlayout(2,1); % 创建2行1列的布局 nexttile % 激活第一个子图 scatter(x1,y1) legend('Data') nexttile % 激活第二个子图 h = heatmap(xvalues_HM,yvalues_HM,z1);
之后保留原saveas语句即可正常运行。
方案3:升级MATLAB版本
该Bug在MATLAB R2021a及以后的版本中已被官方修复,升级版本可直接解决问题。
内容的提问来源于stack exchange,提问作者user2587726
相关产品推荐
相关产品推荐

