The BLAS_AXPY procedure updates an existing array by adding a multiple of another array. It can also be used to update one or more one-dimensional subvectors of an array according to the following vector operation:

where a is a scale factor and X is an input vector.

BLAS_AXPY can be faster and use less memory than the usual IDL array notation
(e.g. Y=Y+A*X) for updating existing arrays.

Note: BLAS_AXPY is much faster when operating on entire arrays and rows, than when used on columns or higher dimensions.

Syntax


BLAS_AXPY, Y, A, X [, D1, Loc1 [, D2, Range]]

Arguments


Y

The array to be updated. Y can be of any numeric type. BLAS_AXPY does not change the size and type of Y.

A

The scaling factor to be multiplied with X. A may be any scalar or one-element array that IDL can convert to the type of X. BLAS_AXPY does not change A.

X

The array to be scaled and added to array Y, or the vector to be scaled and added to subvectors of Y.

D1

An optional parameter indicating which dimension of Y is to be updated.

Loc1

A variable with the same number of elements as the number of dimensions of Y. The Loc1 and D1 arguments together determine which one-dimensional subvector (or subvectors, if D2 and Range are provided) of Y is to be updated.

D2

An optional parameter, indicating in which dimension of Y a group of one-dimensional subvectors are to be updated. D2 should be different from D1.

Range

A variable containing D2 indices indicating where to put one-dimensional updates of Y.

Keywords


None

Examples


The following examples show how to use the BLAS_AXPY procedure to add a multiple of an array, add a constant, and a group of subvectors.

seed = 5L

Create a multidimensional array:

A = FINDGEN(4, 5, 2)

Print A:

PRINT, A

IDL prints:

     0.000000      1.00000      2.00000      3.00000
      4.00000      5.00000      6.00000      7.00000
      8.00000      9.00000      10.0000      11.0000
      12.0000      13.0000      14.0000      15.0000
      16.0000      17.0000      18.0000      19.0000
 
      20.0000      21.0000      22.0000      23.0000
      24.0000      25.0000      26.0000      27.0000
      28.0000      29.0000      30.0000      31.0000
      32.0000      33.0000      34.0000      35.0000
      36.0000      37.0000      38.0000      39.0000

Create a random update:

B = RANDOMU(seed, 4, 5, 2)

Print B

PRINT, B

IDL prints:

     0.172861     0.680409     0.917078     0.917510
     0.766779     0.648501     0.334211     0.505953
     0.652182     0.158174     0.912751     0.257593
     0.810990     0.267308     0.188872     0.237323
     0.312265     0.551604     0.944883     0.673464
 
     0.613302    0.0874299     0.782052     0.374534
    0.0799968     0.581460     0.433864     0.459824
     0.634644     0.182057     0.832474     0.235194
     0.432587     0.453664     0.738821     0.355747
     0.933211     0.388659     0.269595     0.796325

Add a multiple of B to A (i.e., A = A + 4.5*B):

BLAS_AXPY, A, 4.5, B

Print A:

PRINT, A

IDL prints:

     0.777872      4.06184      6.12685      7.12880
      7.45051      7.91825      7.50395      9.27679
      10.9348      9.71178      14.1074      12.1592
      15.6495      14.2029      14.8499      16.0680
      17.4052      19.4822      22.2520      22.0306
 
      22.7599      21.3934      25.5192      24.6854
      24.3600      27.6166      27.9524      29.0692
      30.8559      29.8193      33.7461      32.0584
      33.9466      35.0415      37.3247      36.6009
      40.1994      38.7490      39.2132      42.5835

Add a constant to a subvector of A (i.e. A[*, 3, 1] = A[*, 3, 1] + 4.3):

BLAS_AXPY, A, 1., REPLICATE(4.3, 4), 1, [0, 3, 1]

Print A:

PRINT, A

IDL prints:

     0.777872      4.06184      6.12685      7.12880
      7.45051      7.91825      7.50395      9.27679
      10.9348      9.71178      14.1074      12.1592
      15.6495      14.2029      14.8499      16.0680
      17.4052      19.4822      22.2520      22.0306
 
      22.7599      21.3934      25.5192      24.6854
      24.3600      27.6166      27.9524      29.0692
      30.8559      29.8193      33.7461      32.0584
      38.2466      39.3415      41.6247      40.9009
      40.1994      38.7490      39.2132      42.5835

Create a vector update and print:

C = FINDGEN(5)
PRINT, C

IDL prints:

     0.000000      1.00000      2.00000      3.00000      4.00000

Add C to a group of subvectors of A (i.e. FOR i = 0, 1 DO A[1, *, i] = A[1, *, i] + C) and print:

BLAS_AXPY, A, 1., C, 2, [1, 0, 0], 3, LINDGEN(2)
PRINT, A

IDL prints:

     0.777872      4.06184      6.12685      7.12880
      7.45051      8.91825      7.50395      9.27679
      10.9348      11.7118      14.1074      12.1592
      15.6495      17.2029      14.8499      16.0680
      17.4052      23.4822      22.2520      22.0306
 
      22.7599      21.3934      25.5192      24.6854
      24.3600      28.6166      27.9524      29.0692
      30.8559      31.8193      33.7461      32.0584
      38.2466      42.3415      41.6247      40.9009
      40.1994      42.7490      39.2132      42.5835

Version History


5.1

Introduced

See Also


REPLICATE_INPLACE