
Diese Demonstration zeigt einige grundlegende Funktionen von Listen und Matrizen. Ich beginne mit Listen und öffne ein neues Skript-Editor-Fenster. Das Tastenkürzel ist Strg+T. Ich passe die Größe an und ordne es neu an. Ich zeige das Protokoll vor dem Journal an. Ich erstelle eine Variable namens „Liste“. Dieser weise ich die Ergebnisse der Listenfunktion zu. Das Wort „Liste“ wird in Klammern geöffnet. Ich verwende die Variablen a und b. Anschließend berechne ich die Quadratwurzel von sqrt und setze dann Klammern. Anschließend formatiere ich die Groß- und Kleinschreibung sowie die Leerzeichen. Anschließend führe ich das Skript aus. Im Protokoll wird lediglich angezeigt, dass eine Liste mit drei Elementen zugewiesen wurde. Wenn ich mit der Maus über meine Liste fahre, sehen wir, dass die eingegebenen Elemente unbewertet gespeichert sind. Es handelt sich also um die beiden Variablen und die Funktion Quadratwurzel. In einer neuen Zeile meines Skript-Editors fordere ich die Auswertung der Listenelemente an. Ich tippe „eval list“ in offenen Klammern und führe diese Zeile aus. Dort sehe ich die ausgewerteten Ergebnisse. Meine Liste bleibt jedoch unbewertet. Um mit den Ergebnissen von „eval list“ zu arbeiten, könnte ich das Ergebnis der Listenauswertung einer neuen Liste zuweisen. Es gibt jedoch noch weitere Möglichkeiten, Indizes zu verwenden, um mit ausgewerteten Listenelementen zu arbeiten. Bevor ich darauf eingehe, möchte ich zunächst allgemein über die Indizierung der Liste sprechen. Ich gehe also in eine neue Zeile und tippe „my list“ in offenen eckigen Klammern. Mit „a“ extrahiere ich das zweite Listenelement. Wenn ich diese Zeile ausführe, sehe ich das unbewertete Element. Was wäre, wenn ich das ausgewertete Ergebnis haben möchte? Ich kann hier direkt zu meiner zweiten Zeile zurückkehren. Ich kann die Auswertung meiner Liste anfordern und das Ergebnis dann indizieren. Dazu setze ich eine öffnende eckige Klammer, ein „a“ hinein und eine schließende. Und ich führe die Zeile erneut aus, indem ich die Eingabetaste auf dem Ziffernblock ganz rechts auf meiner Desktop-Tastatur drücke. So, ich habe die ausgewertete Liste indiziert, um das Ergebnis zu erhalten. Wir haben über das Ändern von Listen gesprochen. Ich gehe also in eine neue Zeile und verwende „Einfügen in“. „Einfügen in“ ändert die Liste an Ort und Stelle. Ich öffne also die Klammern. Und welche Liste ändere ich? Sie ist in meiner Liste gespeichert. Das ist das erste Argument. Was möchte ich hinzufügen? Ich füge den Namen John hinzu. Das ist also eine Zeichenfolge. Wenn ich das Komma und das dritte Argument nicht setze, wird die Liste einfach am Ende der Liste eingefügt. Aber ich werde das Komma verwenden und ein „a“ als optionales drittes Argument eingeben, um sie an die zweite Position zu setzen. Und dann führe ich genau diese Zeile aus. „insert into“ gibt eigentlich nichts an das Protokoll zurück. Wenn ich aber mit der Maus über meine Liste fahre, irgendwo im Skript, sehen Sie, dass sie so geändert wurde, dass der Name „John“ an zweiter Stelle steht. Nehmen wir an, ich habe eine Liste, die mir vielleicht von einer JSL-Funktion zurückgegeben oder beispielsweise zur Erfassung von Benutzereingaben verwendet wurde. Und ich muss ein Element in der Liste finden, um es entfernen zu können. Ich weiß, dass es in der Liste ist – nun ja, ich weiß nicht, ob es in der Liste ist. Ich möchte zunächst abfragen, ob es in der Liste ist. Und wenn ja, möchte ich es entfernen können. Also erstelle ich eine Variable, um die Position des Elements „John“ zu speichern. Ich nenne sie „pos“. Und ich weise ihr das Ergebnis der Funktion „contains“ zu. Wir haben also „contains“ mit Zeichenfolgen gesehen. Nun „contains“ mit einer Liste. Wir suchen in meiner Liste nach der Zeichenfolge „John“, und natürlich wird die Groß- und Kleinschreibung beachtet. Wenn ich diese Zeile ausführe, wird das Ergebnis zurückgegeben und in der Variable „pos“ gespeichert. Wenn ich das dann beispielsweise aus der Liste entfernen möchte, könnte ich „remove“ in öffnenden Klammern eingeben. Wir schauen in meine Liste. Anstatt nur das letzte Element zu entfernen, was ich erhalten würde, wenn ich nach dem ersten Argument nichts angegeben hätte, verwende ich die Variable „pos“. Ich führe diese Zeile aus. Das Ergebnis gibt eine Liste mit der Anzahl der entfernten Elemente zurück. Standardmäßig wird ein Element ab der im zweiten Argument angegebenen Position verwendet. Ich erhalte also eine Liste mit dieser Zeichenfolge. Ich könnte dieses Ergebnis einer eigenen Variable zuweisen, wenn ich das Listenelement an anderer Stelle in meinem Skript verwenden möchte. Ich könnte es auch aus der zurückgegebenen Liste extrahieren, indem ich es mit „subskriptionieren“ verknüpfe. Meine Liste enthält „John“ jetzt nicht mehr. Ich führe meine Zeile erneut aus. Der in „pos“ gespeicherte Wert bleibt unverändert. Ich führe die Zeile „Und“ aus, wodurch die Zeichenfolge zurückgegeben wird, die nicht in der Liste enthalten ist. Wenn ich mit der Maus über meine Liste fahre, sehen wir, dass sie auf ihren vorherigen Wert zurückgesetzt wurde. Lassen Sie uns kurz über Matrizen sprechen. Ich klicke mit der rechten Maustaste in das Protokoll, um es zu löschen, und wähle dann alles im Skript-Editor aus und lösche es. Ich beginne mit der Simulation von Personen, die die Zeilen meiner Matrix bilden. Jede dieser Personen würfelt fünfmal mit einem sechsseitigen Würfel. Das sind meine Spalten. Ich generiere diese mit einem Zufallszahlengenerator, beginne aber mit einem bestimmten Startwert, sodass Sie, wenn Sie weitermachen, genau die gleichen Zufallszahlen erhalten. Wir verwenden eine Funktion namens „j“, die eine Matrix mit einer bestimmten Anzahl von Zeilen und Spalten erstellt. Das sind die ersten beiden Argumente, und der Wert in der Matrix ist das dritte Argument. Ich verwende die Random-Reset-Funktion mit dem Wert . Damit lege ich wieder meinen Startwert für den Zufallszahlengenerator fest. Ich führe ihn also aus. In einer neuen Zeile erstelle ich die Variable m, der das Ergebnis der Funktion j zugewiesen wird. Ich beginne wieder mit der Anzahl der Zeilen, in denen wir Personen simulieren, und dann mit der Anzahl der Spalten, wobei ich fünfmal mit einem sechsseitigen Würfel werfe. Ich verwende die Random-Integer-Funktion mit den Argumenten – wir beginnen bei und wählen Zufallszahlen bis zu . Auch hier kann ich das neu formatieren, damit es ein bisschen aussieht – Ups, ich habe es ausgeführt, anstatt es neu zu formatieren. Ich kann es immer noch neu formatieren. So, jetzt ist es also auch ausgeführt. Wenn wir das Log etwas vergrößern, sehen Sie, dass ich eine zeilenweise Matrix habe. Und wie beziehe ich mich auf Elemente in dieser Matrix? Nun, wir verwenden Indizes. Ich gehe also in eine neue Zeile. Vielleicht interessiert mich, was die fünfte Person beim dritten Würfelwurf gewürfelt hat. Ich setze also den Variablennamen m in den Index, also m und dann eckige Klammern. Für die Zeilennummer, Komma, für die Spaltennummer, schließe die eckigen Klammern und führe die Zeile aus. Die fünfte Person hat also beim dritten Wurf a gewürfelt. Und das können wir tatsächlich überprüfen. Es gibt also eins, zwei, drei, vier, die fünfte Zeile und den dritten Würfelwurf. Was ist nun, wenn ich eine ganze Zeile oder eine ganze Spalte suchen möchte? Nun, in einer neuen Zeile hier – eigentlich verwende ich dieselbe Zeile und ersetze einfach den Index in meiner Zeile. Nehmen wir an, ich möchte die gesamte Zeile. Also tippe ich für den ersten Index. Und nach dem Komma tippe ich a, um anzuzeigen, dass keine bestimmte Spalte ausgewählt werden soll. Das wird Zeile für Zeile, jede Spalte. Und ich kann das ausführen. Und das gibt mir Zeile für Zeile alle Werte. Wenn Sie nach oben scrollen, können wir überprüfen, ob dies tatsächlich die Werte in Zeile 1 sind. Das ist also das Ergebnis. Genauso könnte ich eine Spalte auswählen, in der ich einfach ein a als Zeilenindex und dann eine beliebige Spaltennummer einfüge. Nehmen wir an, ich möchte eine ganze Zeile löschen. Nehmen wir an, die dritte Person hat beim Würfeln geschummelt. Ich indiziere m mit a und a. Vor dem Semikolon weise ich dieser Zeile den Wert einer leeren Matrix zu. Dazu öffne und schließe ich einfach die eckigen Klammern. Wenn ich diese Zeile ausführe, wird eine leere Matrix im Protokoll zurückgegeben. Wenn ich mit der Maus über m fahre und die Zeilen zähle, sehen Sie, dass es jetzt nur noch neun Zeilen gibt. Nun, um ein wenig mit den Möglichkeiten von Matrizen herumzuexperimentieren, nehmen wir an, die neun verbleibenden Personen würfeln jeweils zum sechsten Mal. Ich mache das an Ort und Stelle. Die Operatoren sind m. Der Zuweisungsoperator ist Concat. Er besteht aus zwei vertikalen Strichen und einem Gleichheitszeichen. Keine Leerzeichen, da zwischen den mehrstelligen Komponenten dieser Operatoren keine Leerzeichen zulässig sind. Ich verwende erneut die Funktion j. Wir haben nur neun Zeilen und benötigen eine Spalte. Ich verwende wieder eine Zufallszahl. Als Argumente dient immer noch ein sechsseitiger Würfel, daher liefere ich. Dadurch wird m direkt modifiziert, indem eine sechste Spalte hinzugefügt wird. Sie sehen also, dass die Matrix jetzt sechs Spalten hat. Wir löschen nun das Log. Ich beginne von vorne mit der Zuweisung von Werten an m. Ich verwende keine Zufallszahlen mehr. Ich lösche den Inhalt des Skript-Editors. Ich initialisiere eine Zählervariable i und weise ihr den Wert von zu. Ich führe das aus, um sie zu initialisieren. In einer neuen Zeile weise ich m eine andere Matrix zu. M erhält also das Ergebnis der Funktion j. Sie hat fünf Zeilen. Diese Matrix hat fünf Zeilen und fünf Spalten. Beginnend bei wird i für jedes Element der Matrix um 1 erhöht. Ich verwende also den i-plus-plus-Operator, der direkt addiert. Und ich führe ihn aus. So habe ich eine 1-Matrix. Beachten Sie, dass wir zeilenweise und nicht spaltenweise inkrementieren. Das ist wichtig für eine andere Methode der Indizierung, die wir gleich sehen werden. Wir inkrementieren also zeilenweise. Was ist nun, wenn ich eine Sequenz brauche, die tatsächlich bis 1 geht? Nun, es gibt sicherlich viele verschiedene Möglichkeiten, das zu tun. Eine schnelle Möglichkeit wäre jedoch, jedes Element der gerade erstellten Matrix mit 1 zu multiplizieren. Und auch hier können wir diese Operationen vektorisieren. Ich muss nicht durch die Matrix schleifen. Ich weise einfach 1 zu – und ich werde eine weitere direkte Zuweisung durchführen – 1 m und dann das Sternchen ist gleich, also multiplizieren wir mit 1. Wir müssen das nicht direkt durchführen. Aber anstatt eine neue Variable zu erstellen, mache ich das. Auch hier muss ich keine Schleife ausführen. Es wird elementweise vorgegangen und alles mit multipliziert. Und das führe ich aus. Und so gibt es diese Matrix, die von bis in Schritten von geht. Eine andere Möglichkeit, diese Matrix zu erstellen, wäre in zwei Schritten, beginnend mit der Indexfunktion. Ich lösche also den Inhalt des Skript-Editors. Ich lösche auch das Protokoll. Und im Skript-Editor-Fenster tippe ich m ein. Dem wird der Wert zugewiesen, der sich aus der Indexfunktion ergibt – Index öffnende Klammern. Und wir beginnen bei. Wir zählen bis. Das optionale dritte Argument, das ich hier verwende, ist das Inkrement. Also gehen wir nach vor. Hier ist also der erste Schritt zur Erstellung der Matrix, wir hatten die by-Matrix. Wir erstellen also einen Zeilenvektor mit der Indexfunktion. Und dann kann ich das formen. Ich gehe also zu einer neuen Zeile und überschreibe m erneut. m ist also das Ergebnis der Shape-Funktion, die m als erstes Argument verwendet und die Dimensionen auf fünf Zeilen und fünf Spalten ändert. Mit dieser Shape-Funktion ist äußerste Vorsicht geboten. Wenn Ihr Zeilenvektor in diesem Fall nicht mit der hier angegebenen quadratischen Matrix übereinstimmt, kürzt JMP diesen Vektor, wenn die von Ihnen mit Shape angegebene Matrix zu klein ist. Oder wenn Sie eine größere Matrix angeben, wiederholt JMP den Vektor einfach. Seien Sie also vorsichtig bei der Verwendung der Shape-Funktion. Ich möchte sie ausführen. Und da ist wieder die quadratische Matrix, die von bis in Schritten von reicht. Ein Grund dafür, abgesehen von den vielen Möglichkeiten, die JMP normalerweise bietet, ist, eine andere Art der Indizierung zu besprechen. Wir haben die zeilenweise Indizierung von Spalten gesehen. Und ich möchte über die einfache Indizierung sprechen, die Sie manchmal sehen werden. Wenn ich also wollte – wir können die Funktion „contains“ mit – wir haben sie mit Zeichenfolgen gesehen – verwenden. Sie können sie mit Listen verwenden. Wir können es mit Matrizen verwenden. Wenn ich die Position der Zahl in der Matrix suchen möchte, die aktuell in m gespeichert ist, würde ich bei der Beschreibung sagen: „OK, es ist Zeile/Spalte.“ Ich würde also einen Kommaindex verwenden. Wenn ich JMP aber bitten würde, das für mich zu finden, verwende ich einfach „enthält“. In der Praxis könnte Ihr Skript dieses Ergebnis einer Variablen zuweisen. Das muss ich hier nicht tun: „enthält“ und dann „m“ Komma. JMP gibt mir nichts, sondern einen einzelnen Wert. Wie funktioniert dieser einzelne Wert? Der Einzelwertindex – also, wenn ich zurückkomme – gehe ich hier in eine neue Zeile und tippe „m“ und dann die eckigen Klammern mit einem Einzelwertindex und führe das aus. Der Einzelwertindex behandelt meine Matrix wie einen Zeilenvektor und zählt von der ersten Position an. Wenn wir also im Protokoll zurückgehen, um das Ergebnis meiner Indexfunktion zu sehen, behandelt dieser einzelne Index ihn als Zeilenvektor und zählt zeilenweise, genau wie wir zeilenweise inkrementiert haben, um die Position dieses Werts zu ermitteln. Wir werden später weitere Beispiele sehen, wenn wir mit Matrizen arbeiten, bei denen JMP diesen einzelnen Index zurückgibt. Als Letztes führen wir hier eine beliebige Berechnung durch, um zu veranschaulichen, dass es Funktionen gibt, die Matrizen als Argumente verwenden können – Berechnungsfunktionen. Wir haben bereits die Shape-Funktion und „Contains“ gesehen. Ich gehe hier aber in eine neue Zeile und tippe log und dann m als Argument geteilt durch. Und noch etwas zu diesem Beispiel: Lassen Sie es mich ausführen. Und dann erkläre ich Ihnen noch etwas zu diesem Beispiel. Ich habe die Berechnung für jedes Element durchgeführt und durch geteilt. Außerdem möchte ich erwähnen, dass Funktionen in JSL Funktionen als Argumente verwenden können. Wir werden das immer wieder sehen. Wir haben bereits einige Beispiele gesehen. Dieser Divisionsoperator ist die Divisionsfunktion, die den Logarithmus von m als Argument verwendet. Ich musste den Logarithmus von m nicht berechnen und in einer Variablen speichern, um ihn der Divisionsfunktion bereitzustellen. Ich konnte die Berechnung direkt durchführen. Wenn ich die Funktion so ausschreiben würde, würde ich die Klammern öffnen und schließen. Ersetzen Sie den Operator durch ein Komma und schließen Sie die Klammern. So muss ich keine Variable angeben, die diese Werte speichert. Ich kann sie berechnen, während ich die Divisionsfunktion ausführe. Dies sind einige Beispiele für Listen und Matrizen und einige der Möglichkeiten, wie wir mit diesen speziellen Arten von Datenstrukturen arbeiten können.