List selected vector elements | SLSTxx/DLSTxx/ILSTxx/CLSTxx/ZLSTxx | |
Output | nindx | If n ≤ 0, then nindx = 0. Otherwise, nindx is the |
|
| number of elements of x that satisfy the relationship |
|
| with a specified by the subprogram name. |
| indx | Array filled with the list of indices i of the elements xi |
|
| of x that satisfy the relationship with a specified by the |
|
| subprogram name. Only the first nindx elements of |
|
| indx are changed. Recall that xi is stored in |
|
| x((i−1)⋅incx+1). |
Notes | These subprograms are sometimes useful for optimizing a loop containing an IF | |
| statement. Refer to “Example 2” on page 101. | |
Fortran |
| SUBROUTINE SLSTEQ (N,X,INCX,A,NI,INDX) |
Equivalent |
| REAL*4 X(*),A |
|
| INTEGER*4 INDX(*) |
|
| INCXA = ABS ( INCX ) |
|
| IX = 1 |
|
| NI = 0 |
|
| DO 10 I = 1, N |
|
| IF ( X(IX) .EQ. A ) THEN |
|
| NI = NI + 1 |
|
| INDX(NI) = I |
|
| END IF |
|
| IX = IX + INCXA |
| 10 CONTINUE | |
|
| RETURN |
|
| END |
Example 1 Build a list of the indices of the positive elements of a REAL*8 vector x, where x is a vector 10 elements long stored in a
INTEGER*4 N,INCX,NINDX,INDX(20)
REAL*8 | A,X(20) |
N = 10 |
|
INCX = 1 |
|
A = 0.0D0
CALL DLSTGT (N,X,INCX,A,NINDX,INDX)
Example 2 Optimize the following program segment, where the THEN clause of the IF statement is much more likely than the ELSE clause.
Chapter 2 Basic Vector Operations 101