Whenever possible, vector and array data should always be processed with IDL array operations instead of scalar operations in a loop. For example, consider the problem of inverting a 512 ´ 512 image. This problem arises because approximately half the available image display devices consider the origin to be the lower-left corner of the screen, while the other half recognize it as the upper-left corner.
The following example is for demonstration only. The IDL system variable
A programmer without experience in using IDL might be tempted to write the following nested loop structure to solve this problem:
FOR I = 0, 511 DO FOR J = 0, 255 DO BEGIN ;Temporarily save pixel image. temp = image[I, J] ;Exchange pixel in same column from corresponding row at bottom image[I, J] = image[I, 511 - J] image[I, 511-J] = temp ENDFOR
A more efficient approach to this problem capitalizes on IDL's ability to process arrays as a single entity:
FOR J = 0, 255 DO BEGIN ;Temporarily save current row. temp = image[*, J] ;Exchange row with corresponding row at bottom. image[*, J] = image[*, 511-J] image[*, 511-J] = temp ENDFOR
At the cost of using twice as much memory, processing can be simplified even further by using the following statements:
;Get a second array to hold inverted copy. image2 = BYTARR(512, 512) ;Copy the rows from the bottom up. FOR J = 0, 511 DO image2[*, J] = image[*, 511-J]
Even more efficient is the single line:
image2 = image[*, 511 - INDGEN(512)]
that reverses the array using subscript ranges and array-valued subscripts.
Finally, using the built-in ROTATE function is quickest of all:
image = ROTATE(image, 7)
Inverting the image is equivalent to transposing it and rotating it 270 degrees clockwise.