Animated gif of random green letters with random red J, M, and P charactersAnimiertes GIF mit zufälligen grünen Buchstaben und zufälligen roten J-, M- und P-Zeichen
JMP verfügt über einen leistungsstarken Satz Matrixprimitive in der JSL-Skriptsprache. Hier finden Sie eine Einführung in die Erstellung und Verwendung von 1D- und 2D-Matrizen in JSL.
Eine JSL-Matrixkonstante für eine Matrix mit 3 Zeilen und 2 Spalten sieht folgendermaßen aus: Beachten Sie die Leerzeichen zwischen Elementen in einer Zeile und die Kommas zwischen Zeilen.
constant = [
1 2,
3 4,
5 6
];
Wenn Sie diesen Code ausführen, wird er im Protokollfenster wie folgt angezeigt (und Sie können ihn auch in eine Zeile schreiben):
[1 2, 3 4, 5 6]
Die eckigen Klammern definieren eine Konstante, die beim Parsen der JSL erstellt wird. Sie können keine anderen JSL-Variablen zwischen den eckigen Klammern verwenden, da der Parser ausgeführt wird, bevor die Variablen vorhanden sind (mehr dazu gleich). Zwei weitere Beispiele mit 1D-Matrizen:
RowVector = [1 2];
ColVector = [3,4];
JSL verfügt über mehrere Funktionen zum Erstellen von Matrizen. Normalerweise verwende ich J( nRows, nCols, init ), mit 0 für den dritten drin Wert.
squareOnes = J(5);
[1 1 1 1 1,
1 1 1 1 1,
1 1 1 1 1,
1 1 1 1 1,
1 1 1 1 1]
diagOnes = identity(5);
[1 0 0 0 0,
0 1 0 0 0,
0 0 1 0 0,
0 0 0 1 0,
0 0 0 0 1]
colsAndRows = J(3,2,random integer(1,6));
[2 6, 2 5, 5 2]
Sie können Matrizen auch erstellen, indem Sie Werte horizontal oder vertikal verketten. Dieselben Verkettungsoperatoren verketten Matrizen mit kompatiblen Größen (hier nicht gezeigt).
a=1;b=2;c=3;d=4;e=5; // now we can use variables as follows
row1 = a::e; // row
[1 2 3 4 5]
col1 = (a::e)`; // column - transpose operator
[1, 2, 3, 4, 5]
row2 = a||22||c||44||e; // row - concatenate horizontal
[1 22 3 44 5]
col2 = a|/222|/c|/444|/e; // column - concatenate vertical
[1, 222, 3, 444, 5]
Das winzige `-Zeichen befindet sich oben links auf einer US-Tastatur und ist der Matrix-Transponierungsoperator. Der ::-Operator erstellt eine Matrix aus ganzen Zahlen. Sie können mit einem Skalar multiplizieren und einen Skalar hinzufügen, um die gewünschte Ergebnismatrix zu erhalten.
(0::9)*.1+100
[100 100.1 100.2 100.3 100.4 100.5 100.6 100.7 100.8 100.9]
Matrizen werden wie üblich tiefgestellt. Matrixindizes beginnen in JSL bei 1 und nicht bei 0 wie in einigen Sprachen.
M = [
11 12 13 14 15,
21 22 23 24 25,
31 32 33 34 45
];
write(M);
[ 11 12 13 14 15,
21 22 23 24 25,
31 32 33 34 45]
write(M[2,3])
23
Und sie können auf wirkungsvolle Weise in Scheiben geschnitten und gewürfelt werden:
write(M[2::3, 1::2]); // return a 2x2 sub-matrix
[21 22, 31 32]
write(M[1,0]); // 0 means the entire dimension
[11 12 13 14 15]
write(M[0,2::3]); // various combinations
[12 13, 22 23, 32 33]
In JSL gibt es eine Matrixfunktion namens „Shape“, die manchmal nützlich ist, um einen Zeilen- oder Spaltenvektor in eine 2D-Matrix umzuformen. Es gibt zwei Multiplikationsoperatoren für Matrizen, einen für Matrixalgebra-Multiplikationen ( m1 * m2 ) und einen anderen für die Element-für-Element-Multiplikation:
[1 2, 3 4]
[2 3, 4 5]
[2 6, 12 20]
Erinnere dich daran
Operator, wenn Sie wirklich unerwartete Ergebnisse erhalten, wenn Sie zwei Bilder miteinander multiplizieren!
Sie können auch Matrixelementen oder Slices Werte zuweisen:
mat = J(2,3,.); // 2 rows, three columns, all missing
mat[1,1] = 7; // the top left corner
mat[0,2::3] = [5 9, 13 15]; // all rows, columns 2 and 3
write(mat); // notice the missing value that never got set
[7 5 9, . 13 15]
Schließlich ist hier der Code für das animierte GIF fast hat nichts mit dem Thema zu tun. Es verwendet Matrizen auf überraschende Weise, um Bilder und Zeichen zu manipulieren, und ist wahrscheinlich nicht das Beispiel, mit dem Sie beginnen möchten.
matgif = "$desktop/mat.gif";
gb = Graph Box(framesize(500,300));
gb << setBackgroundColor( "black" );
gb << setGraphicsScript(
Text Color( "green" );
For( x = -10, x <= 110, x += Random Integer( 2, 4 ),
For( y = -10, y <= 110, y += Random Integer( 3, 7 ),
c = random integer(31,1000);
textcolor("green");
if( random integer(1,10000)<60,
textcolor("red");
c = blobtomatrix(chartoblob(substr("JMP", random integer(1,3),1)),"uint",1,"big")
);
Text( {x, y}, blobtochar(matrixtoblob(c::c,"uint",2,"big"),encoding="utf-16be") )
);
);
);
New Window( "x", gb );
duration=80;//ms
animation = gb[framebox(1)]<<GETPICTURE></GETPICTURE>
https://community.jmp.com/t5/Discussions/Near-neighbors-mean-calculation/mp/345727#M59633 hat ein Beispiel für die Indizierung einer Matrix, M3, mit einer anderen Matrix, indexer2x2, um eine Untermatrix von M3 zu erhalten. Dieses Beispiel dient dazu, einen zusammenhängenden rechteckigen Bereich abzurufen und ihn als 2D-Matrix zurückzugeben. Der Indexer könnte jedoch einen beliebigen Satz von Elementen in beliebiger Reihenfolge abrufen, und die Funktion „shape()“ ist optional, wenn Sie die 1D-Matrix von Elementen wünschen:
M3 = [. . . . . . . . .,
. . . . . . . . .,
. . . . . . . . .,
. . . 1 2 3 . . .,
. . . 4 5 6 . . .,
. . . 7 8 9 . . .,
. . . . . . . . .,
. . . . . . . . .,
. . . . . . . . .];
indexer2x2 = [1 2 10 11]; // top left 2x2 sub-matrix
For( x = 2, x <= 5, x += 1,
For( y = 2, y <= 5, y += 1,
Write( "\!n ", x, " ", y, " ", Shape( M3[indexer2x2 + x + y * 9], 2 ) );
)
);
2 2 [. ., . 1]
2 3 [. 1, . 4]
2 4 [. 4, . 7]
2 5 [. 7, . .]
3 2 [. ., 1 2]
3 3 [1 2, 4 5]
3 4 [4 5, 7 8]
3 5 [7 8, . .]
4 2 [. ., 2 3]
4 3 [2 3, 5 6]
4 4 [5 6, 8 9]
4 5 [8 9, . .]
5 2 [. ., 3 .]
5 3 [3 ., 6 .]
5 4 [6 ., 9 .]
5 5 [9 ., . .]