Nel mio precedente suggerimento JSL , abbiamo visto come è più veloce accedere agli elementi della matrice piuttosto che elencare gli elementi. È ancora più veloce se non è necessario accedere agli elementi. Cioè, ottieni il codice interno di JMP per eseguire il loop e l'accesso agli elementi invece di farlo nel tuo codice JSL. Puoi farlo quando hai solo bisogno di applicare una semplice funzione a ciascun oggetto.
Richiama il ciclo per creare una matrice (monodimensionale) di numeri dispari:
// make a matrix of odd numbers
n = 1000;
y = J(1, n); // creates a 1 x n matrix with all values set to 1
for (i = 1, i <= n, i++,
y = 2 * i - 1;
);
Ecco come appare senza il loop:
// make a matrix of odd numbers
n = 1000;
y = 1::n; // creates a 1 x n matrix with all values set to 1..n
y = 2 * y - 1;
Oltre a sbarazzarci del loop, abbiamo usato una diversa funzione di creazione della matrice. m :: n è una scorciatoia per Index (m, n), che crea una matrice unidimensionale con elementi da m a n, inclusi. Quando applichiamo le operazioni scalari a una matrice, JMP applica tali operazioni a ciascuna cella singolarmente. In questo modo, trasferiamo il loop da interni JSL a JMP. Quasi tutte le funzioni numeriche possono essere applicate in questo modo.
Sqrt( y ); // [1 1.41421356 1.7320508 2 2.23606 ...
Power( y, y ); // [1 4 27 256 ...
Log( y ); // 0 0.6931471805 1.09861228 1.38629436 ...
Floor( y / 3 ); // [0 0 1 1 1 2 2 2 3 3 ...
Sine( y / n ); // [0.0009999998 0.0019999986 0.0029999955 ...
Come commentatore Michael notato in precedenza, l'esempio di numeri dispari può essere semplificato ancora di più perché la funzione Index può effettivamente prendere un terzo argomento, che è un incremento. Quindi possiamo ottenere i primi n numeri dispari con:
y = Index( 1, n * 2, 2 ); // odd numbers from 1 to 2n