Animated gif of random green letters with random red J, M, and P charactersGif animado de letras verdes al azar con caracteres J, M y P rojos al azar
JMP tiene un poderoso conjunto de primitivas de matriz en el lenguaje de programación JSL. Aquí hay una introducción a la creación y el uso de matrices 1D y 2D en JSL.
Una constante de matriz JSL para una matriz de 3 filas por 2 columnas se ve así; observe los espacios entre elementos en una fila y las comas entre filas.
constant = [
1 2,
3 4,
5 6
];
Cuando ejecute ese código, se mostrará así en la ventana de registro (y también puede escribirlo en una línea):
[1 2, 3 4, 5 6]
Los corchetes definen una constante que se crea cuando se analiza el JSL. No puede usar otras variables JSL entre corchetes porque el analizador se ejecuta antes de que existan las variables (más sobre eso en un momento). Dos ejemplos más usando matrices 1D:
RowVector = [1 2];
ColVector = [3,4];
JSL tiene varias funciones para crear matrices. Usualmente uso J (nRows, nCols, init), con 0 para el 3er en eso valor.
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]
También puede construir matrices concatenando valores juntos, horizontal o verticalmente. Los mismos operadores de concatenación concatenarán matrices que tengan tamaños compatibles (no se muestran aquí).
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]
El diminuto carácter ` se encuentra en la parte superior izquierda de un teclado de EE. UU. y es el operador de transposición de matriz. El operador :: crea una matriz de enteros. Puede multiplicar por un escalar y agregar un escalar para obtener la matriz de resultados que necesita.
(0::9)*.1+100
[100 100.1 100.2 100.3 100.4 100.5 100.6 100.7 100.8 100.9]
Las matrices se subíndicen de la forma habitual. Los subíndices de matriz comienzan en 1 en JSL, no en 0 como en algunos idiomas.
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
Y se pueden rebanar y cortar en cubitos de maneras poderosas:
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]
Hay una función de matriz en JSL llamada forma que a veces es útil para remodelar un vector de fila o columna en una matriz 2D. Hay dos operadores de multiplicación para matrices, uno para multiplicaciones de álgebra matricial ( m1 * m2 ) y otro para multiplicaciones elemento por elemento:
[1 2, 3 4]
[2 3, 4 5]
[2 6, 12 20]
Recuerda eso
operador si obtiene resultados realmente inesperados al multiplicar dos imágenes!
También puede asignar valores a elementos de matriz o sectores:
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]
Finalmente, aquí está el código para el gif animado que tiene casi nada que ver con el tema. Utiliza matrices de maneras sorprendentes para manipular imágenes y caracteres y probablemente no sea el ejemplo con el que desea comenzar.
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 tiene un ejemplo de indexación de una matriz, M3, con otra matriz, indexer2x2, para obtener una submatriz de M3. Este ejemplo está diseñado para obtener una región rectangular contigua y devolverla como una matriz 2D, pero el indexador podría obtener cualquier conjunto de elementos, en cualquier orden, y la función shape() es opcional si desea la matriz 1D de elementos:
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 ., . .]