2017-03-07 6 views
4

Ich habe gerade die Aussage any('') eine logische 0 zurückgibt, während die Anweisung all('') eine logische 1 zurückgibt.Warum irgendein ('') logisches 0 zurückgibt, während alles ('') logisches 1 zurückgibt?

Wenn die Funktion any nicht glaube, die leere Zeichenfolge (‚‘) als ungleich Null, die Funktion all soll das gleiche tun, aber aus dem Ergebnis die Funktion all scheint die leere Zeichenfolge zu denken (‚‘) als ungleich Null.

BTW, die Ähnliches passiert, wo any(NaN) kehrt logische 0, während all(NaN) kehrt logische 1.

Ist es ein Fehler MATLAB?

Hier ist die Versionsinformation der MATLAB, die ich verwende.
MATLAB Version: 9.1.0.441655 (R2016b)
MATLAB-Lizenznummer: DEMO

+0

Vielleicht fügen Sie es in die Liste http://StackOverflow.com/Questions/1710299/corner-cases-unexpected-and-unusual-matlab?rq=1 – Thilo

+9

Es ist kein Fehler. any (X) bedeutet, dass Sie ein Element von X finden können, das wahr ist; Für keine Elemente können Sie nicht. all (X) bedeutet, dass Sie kein Element von X finden können, das falsch ist; Für keine Elemente können Sie nicht. Vergleichen Sie ∀, ∃ und https: // stackoverflow.com/questions/2195289/why-does-iqueryable-all-return-true-auf-einer-leeren-sammlung, https://stackoverflow.com/questions/30223079/why-does-stream-allmatch-return-true- for-a-empty-stream, https://stackoverflow.com/questions/19601802/how-does-all-in-python-work-on-empty-lists, https://stackoverflow.com/questions/16662727/ why-does-all-return-true-auf-einem-leeren-Array. – Ryan

Antwort

5

Nach der Dokumentation
Definition von any:

any (x) ... bestimmt, ob jedes Element eine Zahl ungleich Null ist oder logische 1 (true)

In der Praxis any ist eine natürliche Erweiterung des logischen OR-Operators.

Wenn A eine leere 0-by-0-Matrix ist, gibt any(A) logisch 0 (false) zurück.

und Definition von all:

alle (x) ... bestimmt, ob die Elemente sind alle ungleich Null oder logische 1 (true)

In der Praxis ist all eine natürliche Erweiterung des logischen UND-Operators.

Wenn A eine leere 0-by-0-Matrix ist, gibt all(A) die logische 1 (wahr) zurück.

Wir können beide Funktionen implementieren:

function out = Any(V) 
    out = false; 
    for k = 1:numel(V) 
     out = out || (~isnan(V(k)) && V(k) ~= 0); 
    end 
end 

function out = All(V) 
    out = true; 
    for k = 1:numel(V) 
     out = out && (V(k) ~= 0); 
    end 
end 

Erläuterung:

-In any wir davon ausgehen, dass alle Elemente, die nicht von Null verschieden sind, wollen [so sind alle Nullen] und wir, dass die Annahme beweisen, ist falsch, so liefern wir einen Anfangswert von false.
-Da any ist eine natürliche Erweiterung des logischen OR-Operator verwenden wir ||
-Da sollten wir für nonzero Zahlen überprüfen verwenden wir V(k) ~= 0
-Da sollten wir prüfen für nonzeros numbers und NaN ist Not a Number wir ~isnan(V(k)) verwenden.

-In all wir davon ausgehen, dass alle Elemente ungleich Null sind [so alle diejenigen sind], und wir wollen beweisen, dass die Annahme falsch ist, so dass wir einen Anfangswert von true
-Da all bieten ist eine natürliche Erweiterung der logischen AND-Operator verwenden wir &&
-Da sollten wir für nonzeros überprüfen wir V(k) ~= 0
-Da die Definition von all verwendet nicht, dass die nicht-Null-Elemente zwingen, Zahlen, die wir nicht verwenden ~isnan(V(k))

+0

Danke für so detaillierte Antwort. Ich denke ich verstehe deine Erklärung. Ich habe auch die Dokumentation überprüft (tatsächlich ignoriert die 'any'-Funktion NaN-Werte, während die' all'-Funktion dies nicht erwähnt) und führt die 2 von Ihnen bereitgestellten Funktionen aus, und die Ergebnisse bestätigen Ihre Erklärung. –

2

Rücksendungen 0, weil es nicht der Fall ist, dass jedes seiner Elemente wahr sind. Eine any-Klausel ist wahr, wenn eines ihrer Elemente wahr ist.

Alle gibt 1 zurück, weil alle seine Elemente wahr sind. Alle ihre Elemente sind wahr, solange keines ihrer Elemente falsch ist und keines ihrer Elemente falsch ist.

1

Es ist bequem und con Wenn Sie eine assoziative Operation über eine leere Liste von Werten anwenden, wird das neutrale Element dieser Operation zurückgegeben. Aus diesem Grund

  • eine Summe von Null Zahlen 0
  • ein Produkt von Null Zahlen 1
  • eine logische oder von Null booleans falsch
  • eine logische und von Null booleans gilt

Schlüsselwörter für weitere Lektüre: Monoid, falten.

0

Ich fand gerade festen Beweis von der Dokumentation über die any und all Funktionen, wie folgt.

Dokumentation der Funktion any
https://www.mathworks.com/help/matlab/ref/any.html

Wenn A eine leere 0-by-0-Matrix ist, jede (A) gibt logische 0 (falsch).

Dokumentation der Funktion all
https://www.mathworks.com/help/matlab/ref/all.html

Wenn A eine leere 0-by-0-Matrix ist, dann werden alle (A) gibt logisch 1 (wahr).

Und die leere Zeichenfolge in MATLAB ist eigentlich ein 0 × 0 leer char-Array (ich es einfach zu finden). Das erklärt meine ursprüngliche Frage aus der Dokumentation.