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 dans JSL.
Une constante de matrice JSL pour une matrice de 3 lignes sur 2 colonnes ressemble à ceci ; notez 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 qui est créée lorsque le JSL est analysé. Vous ne pouvez pas utiliser d'autres variables JSL entre crochets car l'analyseur s'exécute avant que les variables n'existent (plus à ce sujet 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 le 3ème initialiser valeur.
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 qui ont des tailles compatibles (non montré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]
Ce tout petit caractère ` se trouve en haut à gauche d'un clavier américain et est l'opérateur de transposition de la matrice. 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 certains langages.
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 forme 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 que
si vous obtenez des résultats vraiment inattendus en multipliant deux images ensemble !
Vous pouvez également attribuer des valeurs aux éléments de la matrice ou aux tranches :
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]
Enfin, voici le code du gif animé qui a presque rien à voir avec le sujet. Il utilise des matrices de manière surprenante pour manipuler des images et des caractères et ce n'est probablement pas l'exemple avec lequel vous voulez 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>
https://community.jmp.com/t5/Discussions/Near-neighbors-mean-calculation/mp/345727#M59633 a 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 voulez la matrice 1D d'éléments :
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 ., . .]