所以,我正在通过imread('D:\pic1\foo.jpg')
阅读数百个图像文件,其中一些像imread('D:\pic2\Thumbs.db')
。阅读后,我将存储在这样的数据库train(i) = imread('D:\pic1\foo.jpg')
中。问题在于imread('D:\pic2\Thumbs.db')
,这些文件的读取显然会出错。我想像这样缓解这个问题:
for i=1:N
try
train(i) = imread(link{i})
%link{i} can be 'D:\pic2\Thumbs.db' or 'D:\pic1\foo.jpg'
catch
disp('Error')
end
end
问题在于此处的try块。有两件事正在发生,一件是读取文件另一件事是将imread值分配给train(i)
。现在,这很重要,只有成功的imread()
如果有任务,失败就会出现错误。 Matlab通过catch块来处理错误,没有一个块来处理我可以完成赋值的成功条件,这样我就可以轻松地进行读写操作。
我想要这样的事情:
j = 0;
for i=1:N
try:
imread(links{i})
if success:
train(j) = imread(links{i})
j = j+1;
if fail:
error
end
end
我只是在搜索Matlab文档时尝试捕获,如果有任何东西可以帮助我简洁地编写代码,我将非常感激。
答案 0 :(得分:11)
solution by @gnovice是正确的,但可以更简洁地写出来:
ct = 1;
for i=1:N
try
train(ct) = imread(links{i});
ct = ct +1; %# if imread fails, this line is not executed
catch me
%# report the problematic image, and the reason for failure
fprintf('image #%i (%s) cannot be opened: %s\n',i,links{i},me.message)
end
end
答案 1 :(得分:3)
您可以使用continue
语句和临时变量解决此问题,如下所示:
for i=1:N
try
tempVar = imread(link{i});
catch
disp(['Error reading file ' link{i}]);
continue
end
train(i) = tempVar;
end
当imread
抛出错误时,控制权将传递给catch
块,该块显示一条消息,然后调用continue
将控制传递给for循环的下一次迭代,跳过任何后来的命令。成功imread
后,运行try\catch
块后面的代码,将imread
的输出分配给变量train
。