Animated gif of random green letters with random red J, M, and P charactersGif animado de letras verdes aleatorias con caracteres J, M y P rojos aleatorios
JMP tiene un potente conjunto de primitivas matriciales en el lenguaje de programación JSL. A continuación se ofrece una introducción a la creación y el uso de matrices 1D y 2D en JSL.
Una constante matricial 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. Normalmente uso J (nRows, nCols, init), con 0 para el tercer valor inicial .
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 puedes 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 pequeño carácter ` se encuentra en la parte superior izquierda de un teclado estadounidense y es el operador de transposición matricial. El operador :: crea una matriz de números enteros. Puede multiplicar por un escalar y sumar 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 están subíndices 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 multiplicación elemento por elemento:
[1 2, 3 4]
[2 3, 4 5]
[2 6, 12 20]
¡Recuerda el operador
si obtienes resultados realmente inesperados multiplicando dos imágenes juntas!
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 del gif animado que no tiene casi nada que ver con el tema. Utiliza matrices de formas sorprendentes para manipular imágenes y personajes y probablemente no sea el ejemplo con el que quieres empezar.
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 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 puede 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 ., . .]