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
See Also
REPLICATE_INPLACE