为什么在使用 uigetfile 选择文件时出现此错误?

Why am I getting this error when selecting files with uigetfile?

我用了 uigetfile 到 select 多张图片。当我 select 图像并按下打开按钮或按回车键时,一切正常。但是当我改为 select 图像并双击 selected 图像时,我收到此错误:

Cell contents reference from a non-cell array object.

Error in Picketfence>insertpb_Callback (line 141)
                file             = fullfile(PathName,FileNames{i});

这是我的代码:

c={'*.*', 'All Files(*.*)';'*.jpeg','figure (*.jpg)';'*.tif',...
        'figure (*.tif)'};
    [FileNames,PathName] = uigetfile(c, 'Select Images','MultiSelect','on');

if char(FileNames)
    nfiles = length(FileNames);
    handles.profile = zeros(1024,1024);
    for i = 1:nfiles            
        file = fullfile(PathName,FileNames{i});                                
        handles.profile = handles.profile+im2double(imread(file));
    end
end

为什么会出现此错误,我该如何解决?

问题是您无法通过双击 select 多个文件。当您 select 您的文件,然后双击其中一个文件时,实际发生的情况是您 select 仅 您双击的文件.换句话说,第一次双击 select 只是那个,清除其他。

当 GUI 关闭并且 returns 您的代码时,您只有一个文件 selected,因此 FileNames 不是元胞数组,只是一个字符串。这就是 cell content indexing{} 失败的原因。

关于您的代码的几点说明...

  • 您的条件检查 if char(FileNames) 是错误的。 char function doesn't return logical (i.e. boolean) values. It converts things to character arrays. As per the documentation for uigetfile,当 selection 被取消或 GUI 关闭时,输出将为零,因此在您的情况下适当的检查将是:

    if ~isequal(FileNames, 0)
      % Do your processing here...
    else
      % Nothing was selected; take some other action
    end
    
  • 您可能想考虑只有 1 个文件被 selected 的可能性,因此 FileNames 是一个字符数组。执行此操作的最简单方法是首先检查 FileNames 是否为 character array using ischar, and if so encapsulate it in a 1 element cell array(因为您的代码需要元胞数组):

    if ischar(FileNames)
      FileNames = {FileNames};
    end
    

    然后你就可以像上面写的那样做所有的处理了。