Animated gif of random green letters with random red J, M, and P charactersGif animé de lettres vertes aléatoires avec des caractères J, M et P rouges aléatoires
JMP dispose d'un ensemble puissant de primitives matricielles dans le langage de script JSL. Voici une introduction à la création et à l'utilisation de matrices 1D et 2D en JSL.
Une constante matricielle JSL pour une matrice de 3 lignes sur 2 colonnes ressemble à ceci : remarquez les espaces entre les éléments d'une ligne et les virgules entre les lignes.
constant = [
1 2,
3 4,
5 6
];
Lorsque vous exécutez ce code, il s'affichera comme ceci dans la fenêtre du journal (et vous pouvez également l'écrire sur une seule ligne) :
[1 2, 3 4, 5 6]
Les crochets définissent une constante créée lors de l'analyse du JSL. Vous ne pouvez pas utiliser d'autres variables JSL entre crochets car l'analyseur s'exécute avant que les variables n'existent (nous en reparlerons dans un instant). Deux autres exemples utilisant des matrices 1D :
RowVector = [1 2];
ColVector = [3,4];
JSL a plusieurs fonctions pour créer des matrices. J'utilise habituellement J( nRows, nCols, init ), avec 0 pour la 3ème valeur d'initialisation .
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]
Vous pouvez également créer des matrices en concaténant des valeurs ensemble, horizontalement ou verticalement. Les mêmes opérateurs de concaténation concatèneront des matrices ayant des tailles compatibles (non illustrées ici).
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]
Le tout petit caractère ` se trouve en haut à gauche d’un clavier américain et constitue l’opérateur de transposition matricielle. L'opérateur :: crée une matrice d'entiers. Vous pouvez multiplier par un scalaire et ajouter un scalaire pour obtenir la matrice de résultats dont vous avez besoin.
(0::9)*.1+100
[100 100.1 100.2 100.3 100.4 100.5 100.6 100.7 100.8 100.9]
Les matrices sont indicées de la manière habituelle. Les indices matriciels commencent à 1 en JSL, et non à 0 comme dans certaines langues.
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
Et ils peuvent être tranchés et coupés en dés de manière puissante :
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]
Il existe une fonction matricielle dans JSL appelée shape qui est parfois utile pour remodeler un vecteur de ligne ou de colonne en une matrice 2D. Il existe deux opérateurs de multiplication pour les matrices, un pour les multiplications d'algèbre matricielle ( m1 * m2 ) et un autre pour la multiplication élément par élément :
[1 2, 3 4]
[2 3, 4 5]
[2 6, 12 20]
N'oubliez pas cet opérateur
si vous obtenez des résultats vraiment inattendus en multipliant deux images ensemble !
Vous pouvez également attribuer des valeurs aux éléments ou aux tranches de la matrice :
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]
Pour finir, voici le code du gif animé qui n'a quasiment rien à voir avec le sujet. Il utilise des matrices de manière surprenante pour manipuler des images et des personnages et n'est probablement pas l'exemple par lequel vous souhaitez commencer.
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>
<P> </P>https://community.jmp.com/t5/Discussions/Near-neighbors-mean-calculation/mp/345727#M59633 contient un exemple d'indexation d'une matrice, M3, avec une autre matrice, indexer2x2, pour obtenir une sous-matrice de M3. Cet exemple est conçu pour obtenir une région rectangulaire contiguë et la renvoyer sous forme de matrice 2D, mais l'indexeur peut obtenir n'importe quel ensemble d'éléments, dans n'importe quel ordre, et la fonction shape() est facultative si vous souhaitez la matrice d'éléments 1D :
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 ., . .]