2017-07-28 4 views
2

Während ich den isnan(x) Operator benutze, bemerke ich, dass der Ausgang ein Array mit 0 s und 1 s ist, ob das Element NaN ist oder nicht.Indizierung in Isnan

Die logische Möglichkeit, NaN-Elemente herauszufiltern, wäre x(find(~isnan(x))), da find() die Indizes zurückgibt. Als Überraschung für mich gibt x(~isnan(x)) auch das gleiche Ergebnis.

Bei der Überprüfung ist ~isnan(x) nur ein Array von 1s und 0s, und für den einfachen Fall von x = rand(10,1), bekomme ich all(~isnan(x) == ones(10, 1)) als wahr. Aber wenn ich x(ones(10, 1)) ausführen, bekomme ich ein Array mit nur dem ersten Element von x 10 mal wiederholt, wie erwartet.

Was fehlt mir hier?

+7

Werfen Sie einen Blick auf [logische Indexierung] (https://mathworks.com/help/matlab/math/matrix-indexing.html#bq7egb6-1) – m7913d

+2

Auch https://stackoverflow.com/questions/32379805/linear-indexing-logical-indexing-und-all-das – beaker

+0

'x (wahr (10, 1))' wird Ihnen 'x' jedoch zurückgeben. – rlbond

Antwort

4

MATLAB verwendet mehrere Arten von Indizes.

isnan gibt logische Indizes zurück. Das heißt, eine Matrix oder ein Vektor der Größe x, wobei es 1 ist, wenn dieses Element nan ist. Der Ausgang ist logisch "binär" Variable

find sucht nach einem Element, das nicht 0 ist und gibt Ihnen seinen Index. Die Ausgabe sind Ganzzahlen.

Als solche können beide Ausgänge als Indizes verwendet werden, so dass sie das gleiche Ergebnis liefern. Wenn Sie die tatsächlichen Indizes nicht benötigen (was Sie in Ihrem obigen Beispiel nicht tun), verwenden Sie sie nicht. find ist im obigen Fall langsam und redundant.

Wenn Sie nun die Arrays von 1 wie oben beschrieben erstellen, wird sie wie ein Index behandelt (wie find), sodass der Wert des ersten Elements 10 Mal zurückgegeben wird. Der Grund ist, dass die Funktionen ones keine logische Variable zurückgeben, sondern tatsächliche Zahlen (real). Wenn Sie ones durch true ersetzen oder die Ergebnisse zuerst in Binärwerte umwandeln, wird dies als logische Indizes behandelt.