Matlab代码运行时出现vertcat维度不一致错误的排查咨询
解决Matlab中vertcat维度不匹配错误
错误说明
运行代码时反复触发以下错误:
Error using vertcat Dimensions of arrays being concatenated are not consistent.
Error in ListofPictures (line 15) FileNameList = [FileNameList; Fileinfo(imagenumber).name];
错误原因
vertcat(垂直拼接)要求所有待拼接的数组列数完全一致。原代码中Fileinfo(imagenumber).name是字符数组,不同文件名长度不同,垂直拼接时必然因维度不匹配报错。此外,dir(FolderName)会返回目录中的所有项(包括.和..系统目录),这些目录名被错误加入列表后,会进一步放大问题。
修复方案
推荐方案:使用字符串数组(Matlab R2016b及以上版本)
字符串数组无需统一长度,是处理文件名的最优选择。替换原循环生成FileNameList的代码:
Fileinfo = dir(fullfile(FolderName, '*.tif')); % 仅读取tif文件 % 过滤目录项,只保留文件 Fileinfo = Fileinfo(~[Fileinfo.isdir]); % 直接提取所有文件名到字符串数组 FileNameList = string({Fileinfo.name}');
如果要保留循环逻辑,修改如下:
Fileinfo = dir(FolderName); [x,~] = size(Fileinfo); imagenumber = 1; FileNameList = string([]); % 初始化为空字符串数组 while imagenumber <= x % 跳过目录,只处理文件 if ~Fileinfo(imagenumber).isdir FileNameList = [FileNameList; string(Fileinfo(imagenumber).name)]; end imagenumber = imagenumber + 1; end
兼容方案:使用Cell数组(旧版本Matlab)
若Matlab版本不支持字符串数组,改用Cell数组存储文件名:
Fileinfo = dir(FolderName); [x,~] = size(Fileinfo); imagenumber = 1; FileNameList = {}; % 初始化为空Cell数组 while imagenumber <= x if ~Fileinfo(imagenumber).isdir FileNameList = [FileNameList; {Fileinfo(imagenumber).name}]; end imagenumber = imagenumber + 1; end
后续读取文件时,需用FileNameList{n}调用文件名,例如:
RGB = imread(fullfile(FolderName, FileNameList{n}));
额外代码优化
- 避免频繁切换目录:用
fullfile函数拼接文件路径,替代多次cd操作,提升代码稳定性:RGB = imread(fullfile(FolderName, FileNameList(n))); - 修复逻辑错误:原代码中
if FolderName == 0是无效判断(字符串无法与数字0比较),改为:if isempty(FolderName) FolderName = input('What folder are the Images contained in? ','s'); end - 精准过滤文件类型:调用
dir时直接指定文件类型,避免读取无关文件:Fileinfo = dir(fullfile(FolderName, '*.tif'));
修复后的完整代码
% Creates filenamelist or converts images from rgb to grayscale based on user input cd(FolderMain) choice = input('Enter 0 to convert RGB to Greyscale, Enter 1 to create filelist, Enter 2 to do both'); FolderName = input('What folder are the Images contained in? ','s'); % 获取文件夹内所有tif文件,过滤目录 Fileinfo = dir(fullfile(FolderName, '*.tif')); FileNameList = string({Fileinfo.name}'); % 生成字符串数组 [Lengthx,~] = size(FileNameList); if (choice >= 1) [FileNameBase,PathNameBase] = uiputfile('filenamelist.mat','Save as "filenamelist" in image directory (recommended)'); save(fullfile(PathNameBase, FileNameBase),'FileNameList'); end % 转换RGB为灰度图并保存到新文件夹 if (choice ~= 1) if isempty(FolderName) FolderName = input('What folder are the Images contained in? ','s'); end FolderNameNew = string(FolderName) + "greyscale"; NewFolder = mkdir(FolderNameNew); addpath(genpath(FolderNameNew)) n=1; while (n <= Lengthx) % 直接拼接路径,无需cd imgPath = fullfile(FolderName, FileNameList(n)); RGB = imread(imgPath); GreyImage = rgb2gray(RGB); ImageName = "grey" + FileNameList(n); imwrite(GreyImage, fullfile(FolderNameNew, ImageName)); n = n+1; end % 生成灰度图文件夹的文件名列表 Fileinfo = dir(fullfile(FolderNameNew, '*.tif')); FileNameList = string({Fileinfo.name}'); [FileNameBase,PathNameBase] = uiputfile('filenamelist.mat','Save as "filenamelist" in image directory (recommended)'); save(fullfile(PathNameBase, FileNameBase),'FileNameList'); end Choice = input('Would you like to continue to image processing? Enter 1 for yes, 0 for no.'); if Choice == 1 DIC end
内容的提问来源于stack exchange,提问作者Jennifer Zuspan
相关产品推荐
相关产品推荐

