为什么在使用 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
然后你就可以像上面写的那样做所有的处理了。
我用了 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 foruigetfile
,当 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 usingischar
, and if so encapsulate it in a 1 element cell array(因为您的代码需要元胞数组):if ischar(FileNames) FileNames = {FileNames}; end
然后你就可以像上面写的那样做所有的处理了。