Ich habe ein Array von Integer-Zahlen, und ich möchte dieses Array teilen, wo 0 kommt und eine Funktion, die mir Split-Punkte geben.
Beispiel: Array: 0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0
Die Funktion muss diese Zahlen zurückgeben:
%Vor%Diese Zahlen sind ein Index für Anfang und Ende von Zahlen ungleich Null.
Hier ist eine einfache vektorisierte Lösung mit den Funktionen DIFF und FIND :
%Vor% Der obige Code funktioniert, indem zuerst ein Spaltenarray mit Einsen, die Nicht-Null-Elemente angeben, erstellt wird, dieses Array mit Nullen aufgefüllt wird (falls eine der Nicht-Null-Bereiche sich zu den Arraykanten erstreckt) und die elementweisen Unterschiede genommen werden . Dies ergibt einen Vektor edgeArray
mit 1
, der den Beginn eines Nicht-Null-Bereichs angibt, und -1
, das das Ende eines Nicht-Null-Bereichs angibt. Dann wird die Funktion FIND verwendet, um die Indizes der Starts und Enden zu erhalten.
Eine Seitennotiz / Nitpick: das sind nicht die Indizes der Anfang und Ende der Nicht-Null-Spannen, wie Sie sagen. Sie sind technisch die Indizes kurz vor die Starts und kurz nach die Enden der Non-Zero-Spannen. Sie möchten stattdessen Folgendes:
%Vor%Zum Thema, aber mit einer leichten Variation:
%Vor% Da gnovice
bereits auf die Positionssemantik von indices
hingewiesen hat, möchte ich nur hinzufügen, dass mit dieser Lösung verschiedene Schemata sehr einfach gehandhabt werden können, wenn indices
berechnet wird. Also, für Ihre Anfrage: