2013-12-23 14 views
6

So, ich lese Hunderte von Bilddateien über imread('D:\pic1\foo.jpg') und einige von ihnen sind wie imread('D:\pic2\Thumbs.db'). Nach dem Lesen speichere ich in einer Datenbank wie dieser, train(i) = imread('D:\pic1\foo.jpg'). Das Problem ist mit imread('D:\pic2\Thumbs.db'), das Lesen solcher Dateien gibt offensichtlich Fehler. Ich wollte dieses Problem wie folgt abschwächen:versuchen, Block in Matlab

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 

Das Problem ist im Versuch Block hier. Es gibt zwei Dinge, die passieren, wenn einer die Datei liest, der andere den Wert train(i) zuweist. Nun ist das wichtig, nur bei einer erfolgreichen imread() sollte es eine Zuordnung geben und bei einem Fehler würde ein Fehler auftreten. Matlab kümmert sich um den Fehler über den catch-Block, es gibt keinen Block, der sich um die Erfolgsbedingung kümmert, wo ich die Aufgabe erledigen kann, so dass ich ohne viel Aufwand lesen und schreiben kann.

Ich möchte etwas wie folgt aus:

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 

ich nur mit try und catch kam während Matlab docs suchen, werde ich wirklich schätzen, wenn es etwas gibt, das mir den Code kurz und bündig schreiben helfen.

Antwort

10

Die solution by @gnovice korrekt ist, aber es kann ein bisschen kurz und bündig geschrieben werden:

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 
+0

Ich liebe euch. Ich habe am Ende so programmiert. – motiur

3

Sie dieses Problem mit einem continue Anweisung und eine temporäre Variable wie so lösen können:

for i=1:N 
    try 
    tempVar = imread(link{i}); 
    catch 
    disp(['Error reading file ' link{i}]); 
    continue 
    end 
    train(i) = tempVar; 
end 

Wenn imread einen Fehler wirft, wird die Steuerung an den catch Block übergeben, die eine Meldung anzeigt und ruft dann continue zu Übergeben Sie die Steuerung an die nächste Iteration der for-Schleife und überspringen Sie alle späteren Befehle. Wenn imread erfolgreich ist, wird der Code nach dem try\catch-Block ausgeführt und die Ausgabe von imread an Ihre Variable train zugewiesen.

+0

Ich denke, es ist nicht notwendig, Zug für die Umsetzung (i) = tempVar am Ende ist es möglich, es in der try-Block, der catch-Block zeigt den Fehler an und geht zur nächsten Schleife ohne fortfahren. Ich habe hier auf Matlab 'Magie' gehofft, jedenfalls werde ich auch zufrieden sein, dass es keine gibt. – motiur

+0

@whoknows: Sie sind richtig - 'tempVar' wird nicht benötigt. – Jonas

+1

@whoknows: Es sieht so aus, als hätte ich mich darauf konzentriert, dein erstes Beispiel zu reparieren, während @Jonas sich darauf konzentrierte, das zweite zu reparieren. Sie unterscheiden sich hauptsächlich darin, ob Sie möchten, dass 'train' zu * immer * Länge' N' (meins) ist oder ob Sie nur eine Länge haben wollen, die der Anzahl gültiger Bilder (Jonas ') entspricht. Wenn die Antwort von Jonas Ihren Bedürfnissen besser entspricht, können Sie ihm den Scheck geben. Es wird mir nichts ausmachen. ;) – gnovice

Verwandte Themen