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

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}));

额外代码优化

  1. 避免频繁切换目录:用fullfile函数拼接文件路径,替代多次cd操作,提升代码稳定性:
    RGB = imread(fullfile(FolderName, FileNameList(n)));
    
  2. 修复逻辑错误:原代码中if FolderName == 0是无效判断(字符串无法与数字0比较),改为:
    if isempty(FolderName)
        FolderName = input('What folder are the Images contained in? ','s');
    end
    
  3. 精准过滤文件类型:调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 16:57:12