BLAS_AXPY

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