2017-05-24 83 views
1

我用uigetfile来选择多个图像。当我选择图像并按下打开按钮或按下输入键时,一切正常。但是,当我改为选择所选图像的图像,并双击,我得到这个错误:为什么在使用uigetfile选择文件时出现此错误?

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 

为什么会出现这个错误,我怎么能解决这个问题?

回答

0

问题是,您不能通过双击选择多个文件。当您选择文件时,然后双击其中一个文件,实际发生的情况是您只选择双击它。换句话说,第一次点击双击就会选择一个,清除其他的。

当GUI关闭并返回到您的代码时,您只有一个文件被选中,所以FileNames不是一个单元格数组,只是一个字符串。这就是为什么cell content indexing{}失败。关于你的代码

数点...

  • 你的条件检查if char(FileNames)是错误的。 char函数不返回逻辑值(即布尔值)。它将东西转换成字符数组。即按照uigetfile的文档,输出将为零时,选择将被取消或GUI封闭的,所以在你的情况下,适当的检查将是:

    if ~isequal(FileNames, 0) 
        % Do your processing here... 
    else 
        % Nothing was selected; take some other action 
    end 
    
  • 你可能要考虑的唯一可能性1文件被选中,因此FileNames是一个字符数组。要做到这一点最简单的方法是,先检查是否FileNamescharacter array使用ischar,如果是将其封装在1元cell array(因为你的代码期望电池阵列):

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

    然后,你可以做你的按照上面的说明处理。

+0

非常感谢。 – Mahdie

相关问题