Programs with array expressions run faster than programs with scalars, loops, and IF statements. Some examples of slow and fast ways to achieve the same results follow.
The first example adds all positive elements of array B to array A.
;Using a loop will be slow. FOR I = 0, (N-1) DO IF B[I] GT 0 THEN A[I] = A[I] + B[I] ;Fast way: Mask out negative elements using array operations. A = A + (B GT 0) * B ;Faster way: Add B > 0. A = A + (B > 0)
When an IF statement appears in the middle of a loop with each element of an array in the conditional, the loop can often be eliminated by using logical array expressions.
In the example below, each element of C is set to the square-root of A if A[I] is positive; otherwise, C[I] is set to minus the square-root of the absolute value of A[I].
;Using an IF statement is slow. FOR I=0,(N-1) DO IF A[I] LE 0 THEN $ C[I]=-SQRT(-A[I]) ELSE C[I]=SQRT(A[I]) ;Using an array expression is much faster. C = ((A GT 0) * 2-1) * SQRT(ABS(A))
The expression (A GT 0) has the value 1 if A[I] is positive and has the value 0 if A[I]is not. (A GT 0)* 2 - 1 is equal to +1 if A[I] is positive or -1 if A[I] is negative, accomplishing the desired result without resorting to loops or IF statements.
Another method is to use the WHERE function to determine the subscripts of the negative elements of A and negate the corresponding elements of the result.
;Get subscripts of negative elements. negs = WHERE(A LT 0) ;Take root of absolute value. C = SQRT(ABS(A)) ;Negate elements in C corresponding to negative elements in A. C[negs] = -C[negs]