Animated gif of random green letters with random red J, M, and P charactersGif animata di lettere verdi casuali con caratteri J, M e P rossi casuali
JMP dispone di un potente set di primitive di matrice nel linguaggio di scripting JSL. Ecco un'introduzione alla creazione e all'utilizzo di matrici 1D e 2D in JSL.
Una costante di matrice JSL per una matrice di 3 righe per 2 colonne ha questo aspetto; notare gli spazi tra gli elementi su una riga e le virgole tra le righe.
constant = [
1 2,
3 4,
5 6
];
Quando esegui quel codice, verrà visualizzato in questo modo nella finestra di registro (e puoi anche scriverlo su una riga):
[1 2, 3 4, 5 6]
Le parentesi quadre definiscono una costante che viene creata quando il JSL viene analizzato. Non è possibile utilizzare altre variabili JSL tra parentesi quadre perché il parser viene eseguito prima che le variabili esistano (ne parleremo tra poco). Altri due esempi che utilizzano matrici 1D:
RowVector = [1 2];
ColVector = [3,4];
JSL ha diverse funzioni per la creazione di matrici. Di solito uso J( nRows, nCols, init ), con 0 per il 3° dentro valore.
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]
Puoi anche costruire matrici concatenando i valori insieme, orizzontalmente o verticalmente. Gli stessi operatori di concatenazione concateneranno matrici con dimensioni compatibili (non mostrate qui).
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]
Il minuscolo carattere ` si trova in alto a sinistra di una tastiera americana ed è l'operatore di trasposizione della matrice. L'operatore :: crea una matrice di numeri interi. Puoi moltiplicare per uno scalare e aggiungere uno scalare per ottenere la matrice dei risultati di cui hai bisogno.
(0::9)*.1+100
[100 100.1 100.2 100.3 100.4 100.5 100.6 100.7 100.8 100.9]
Le matrici sono indicizzate nel solito modo. I pedici della matrice iniziano da 1 in JSL, non da 0 come in alcune lingue.
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
E possono essere affettati e tagliati a cubetti in modi potenti:
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]
C'è una funzione di matrice in JSL chiamata shape che a volte è utile per rimodellare un vettore riga o colonna in una matrice 2D. Esistono due operatori di moltiplicazione per le matrici, uno per i moltiplicatori di algebra matriciale ( m1 * m2 ) e un altro per la moltiplicazione elemento per elemento:
[1 2, 3 4]
[2 3, 4 5]
[2 6, 12 20]
Ricordati che
operatore se ottieni risultati davvero inaspettati moltiplicando due immagini insieme!
Puoi anche assegnare valori a elementi o fette di 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]
Infine, ecco il codice per la gif animata che ha Quasi niente a che vedere con l'argomento. Usa le matrici in modi sorprendenti per manipolare immagini e caratteri e probabilmente non è l'esempio con cui vuoi iniziare.
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 ha un esempio di indicizzazione di una matrice, M3, con un'altra matrice, indexer2x2, per ottenere una sottomatrice di M3. Questo esempio è progettato per ottenere una regione rettangolare contigua e restituirla come matrice 2D, ma l'indicizzatore potrebbe ottenere qualsiasi insieme di elementi, in qualsiasi ordine, e la funzione shape() è facoltativa se si desidera la matrice 1D di elementi:
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 ., . .]