2017-08-31 3 views
1

Ich habe eine Menge logischer Bedingungen zu überprüfen. Für jede Bedingung, die nicht erfüllt ist, brauche ich eine Fehlermeldung. Hier ist mein Code für ein besseres Verständnis:Finde die Indizes falscher Werte im Array und zeige sie in einem Fehler an

v1 = isequal(c{1, 1}, 'some string'); 
v2 = isequal(c{1, 2}, 0); 
v3 = isequal(c{2, 1}, 'some string'); 
v4 = isequal(c{2, 2}, 0); 
v5 = isequal(c{3, 1}, 'some string'); 
v6 = isequal(c{3, 2}, 0); 

v = [v1, v2, v3, v4, v5, v6]; 

In dem obigen Code, kehren einige Tests falsch, so dass sie Nullen sind (false) in v.

Jetzt möchte ich herausfinden, welche Null sind und sie in einem Fehler melden. Zum Beispiel, wenn v3 falsch ist, brauche ich eine Ausgabe, die error('Check the v3 for solving') zeigt.

Ich kann nicht verwenden, wenn Bedingungen mehr als einmal auch ich den Wert von v erhalten muss.

+0

Ich muss jetzt was aus dem 6 ist falsch, so dass ich mesggage in Fehler schreiben kann. Mein Problem ist, wie man findet, welches falsch ist? –

+0

Entschuldigung für nicht klar zu machen. zum Beispiel Ich habe ein Ergebnis v = [1, 0, 0, 1, 0, 1]. Ist es möglich, eine Ausgabe zu erhalten, die v2, v3, v5 als false und die Fehlermeldung als Fehler ('check v2, v3, v5') angibt. wenn es möglich ist, wie? –

Antwort

2

Sie haben nicht alle diese Vergleiche auf ihre eigenen Linien zu tun, können Sie cellfun

c = {'test',  0 
    'some string', 1 
    'some string', 0}; 

V = cellfun(@isequal, c, {'some string', 0; 'some string', 0; 'some string', 0}) 

>> V = 3x2 logical 
    [0 1 
    1 0 
    1 1] 

verwenden, um Ihre v zu erhalten, können Sie diese in einen Vektor machen

v = V(:); % v = [0 1 1 1 0 1].'; 

Dann können Sie Ihre Fehlermeldung erstellen.

error(['Check: ' sprintf('v%d, ', find(~v)) 'did not match criteria']) 

% Output in red (and stops function) as it is an error 
>> Check: v1, v5, did not match criteria 

Natürlich können Sie zum Erstellen von v tragen können, wie Sie waren, oder lassen Sie die Erklärung v = V(:) und V(:) direkt statt v in der find Anweisung des Fehlers verwenden.

Wie auch immer, dies ist im Grunde ein Einzeiler, um den gewünschten Fehler zu erstellen, mit sprintf.


Wenn zwei Kontrollen wirklich sind immer die gleichen zwei Werte (wie 'some string' und 0) Sie müssen sie nicht jedes Mal schreiben, entweder

V = cellfun(@isequal, c, repmat({'some string', 0}, size(c,1), 1)) 

Sie wollen wahrscheinlich zu Überprüfen Sie, ob es mindestens einen Wert von false gibt, bevor Sie einen Fehler starten, tun Sie das mit any ...

if any(~v); error(['Check: ' sprintf('v%d, ', find(~v)) 'did not match criteria']); end; 
0

Versuchen Sie, Blick auf find Funktion. Sie können darüber lesen here.

Kurz gesagt, könnte man schreiben:

idx = find(~v) 

dem Sie die Indizes der Elemente geben würde, die die gegebene Bedingung erfüllen. Weiter könnte dies verwendet werden, um die Fehlerinformationen zu drucken, die Sie benötigen.

Um eine Nachricht anzuzeigen, die Sie verwenden können:

disp(['problem with: ', num2str(idx)]) 

Welche die richtigen Informationen für alle Indizes von Interesse drucken.

+0

@Wolfie Sure 'find (~ v)' ist der richtige Weg, dies sollte nur ein Beispiel sein. Trotzdem bearbeitet. Entsprechend dem bereitgestellten Link sollte find auch für logische Werte 'Datentypen: single |' funktionieren doppelt | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logisch | char ' – Dusteh

Verwandte Themen