2
2
3
3
@license Apache-2.0
4
4
5
- Copyright (c) 2025 The Stdlib Authors.
5
+ Copyright (c) 2024 The Stdlib Authors.
6
6
7
7
Licensed under the Apache License, Version 2.0 (the "License");
8
8
you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@ limitations under the License.
20
20
21
21
# ssyr
22
22
23
- > Perform the symmetric rank 1 operation ` A = α*x*x** T + A ` .
23
+ > Perform the symmetric rank 1 operation ` A = α*x*x^ T + A ` .
24
24
25
25
<section class =" usage " >
26
26
@@ -32,16 +32,16 @@ var ssyr = require( '@stdlib/blas/base/ssyr' );
32
32
33
33
#### ssyr( order, uplo, N, α, x, sx, A, LDA )
34
34
35
- Performs the symmetric rank 1 operation ` A = α*x*x** T + A ` where ` α ` is a scalar, ` x ` is an ` N ` element vector, and ` A ` is an ` N ` by ` N ` symmetric matrix.
35
+ Performs the symmetric rank 1 operation ` A = α*x*x^ T + A ` where ` α ` is a scalar, ` x ` is an ` N ` element vector, and ` A ` is an ` N ` by ` N ` symmetric matrix.
36
36
37
37
``` javascript
38
38
var Float32Array = require ( ' @stdlib/array/float32' );
39
39
40
- var A = new Float32Array ( [ 1.0 , 2.0 , 3.0 , 0 .0 , 1.0 , 2.0 , 0 .0 , 0 .0 , 1.0 ] );
40
+ var A = new Float32Array ( [ 1.0 , 2.0 , 3.0 , 2 .0 , 1.0 , 2.0 , 3 .0 , 2 .0 , 1.0 ] );
41
41
var x = new Float32Array ( [ 1.0 , 2.0 , 3.0 ] );
42
42
43
43
ssyr ( ' row-major' , ' upper' , 3 , 1.0 , x, 1 , A , 3 );
44
- // A => <Float32Array>[ 2.0, 4.0, 6.0, 0 .0, 5.0, 8.0, 0 .0, 0 .0, 10.0 ]
44
+ // A => <Float32Array>[ 2.0, 4.0, 6.0, 2 .0, 5.0, 8.0, 3 .0, 2 .0, 10.0 ]
45
45
```
46
46
47
47
The function has the following parameters:
@@ -51,20 +51,20 @@ The function has the following parameters:
51
51
- ** N** : number of elements along each dimension of ` A ` .
52
52
- ** α** : scalar constant.
53
53
- ** x** : input [ ` Float32Array ` ] [ mdn-float32array ] .
54
- - ** sx** : index increment for ` x ` .
54
+ - ** sx** : stride length for ` x ` .
55
55
- ** A** : input matrix stored in linear memory as a [ ` Float32Array ` ] [ mdn-float32array ] .
56
- - ** lda ** : stride of the first dimension of ` A ` (a.k.a., leading dimension of the matrix ` A ` ).
56
+ - ** LDA ** : stride of the first dimension of ` A ` (a.k.a., leading dimension of the matrix ` A ` ).
57
57
58
- The stride parameters determine how elements in the input arrays are accessed at runtime. For example, to iterate over every other element of ` x ` in reverse order,
58
+ The stride parameters determine how elements in the input arrays are accessed at runtime. For example, to iterate over the elements of ` x ` in reverse order,
59
59
60
60
``` javascript
61
61
var Float32Array = require ( ' @stdlib/array/float32' );
62
62
63
- var A = new Float32Array ( [ 1.0 , 2.0 , 3.0 , 0 .0 , 1.0 , 2.0 , 0 .0 , 0 .0 , 1.0 ] );
64
- var x = new Float32Array ( [ 1 .0 , 2.0 , 3.0 , 4.0 , 5 .0 ] );
63
+ var A = new Float32Array ( [ 1.0 , 2.0 , 3.0 , 2 .0 , 1.0 , 2.0 , 3 .0 , 2 .0 , 1.0 ] );
64
+ var x = new Float32Array ( [ 3 .0 , 2.0 , 1 .0 ] );
65
65
66
- ssyr ( ' row-major' , ' upper' , 3 , 1.0 , x, - 2 , A , 3 );
67
- // A => <Float32Array>[ 26 .0, 17 .0, 8 .0, 0 .0, 10 .0, 5 .0, 0 .0, 0 .0, 2 .0 ]
66
+ ssyr ( ' row-major' , ' upper' , 3 , 1.0 , x, - 1 , A , 3 );
67
+ // A => <Float32Array>[ 2 .0, 4 .0, 6 .0, 2 .0, 5 .0, 8 .0, 3 .0, 2 .0, 10 .0 ]
68
68
```
69
69
70
70
Note that indexing is relative to the first index. To introduce an offset, use [ ` typed array ` ] [ mdn-typed-array ] views.
@@ -75,14 +75,14 @@ Note that indexing is relative to the first index. To introduce an offset, use [
75
75
var Float32Array = require ( ' @stdlib/array/float32' );
76
76
77
77
// Initial arrays...
78
- var x0 = new Float32Array ( [ 1 .0 , 1 .0 , 1 .0 , 1.0 ] );
79
- var A = new Float32Array ( [ 1.0 , 2.0 , 3.0 , 0 .0 , 1.0 , 2.0 , 0 .0 , 0 .0 , 1.0 ] );
78
+ var x0 = new Float32Array ( [ 0 .0 , 3 .0 , 2 .0 , 1.0 ] );
79
+ var A = new Float32Array ( [ 1.0 , 2.0 , 3.0 , 2 .0 , 1.0 , 2.0 , 3 .0 , 2 .0 , 1.0 ] );
80
80
81
81
// Create offset views...
82
82
var x1 = new Float32Array ( x0 .buffer , x0 .BYTES_PER_ELEMENT * 1 ); // start at 2nd element
83
83
84
84
ssyr ( ' row-major' , ' upper' , 3 , 1.0 , x1, - 1 , A , 3 );
85
- // A => <Float32Array>[ 2.0, 3 .0, 4 .0, 0 .0, 2 .0, 3 .0, 0 .0, 0 .0, 2 .0 ]
85
+ // A => <Float32Array>[ 2.0, 4 .0, 6 .0, 2 .0, 5 .0, 8 .0, 3 .0, 2 .0, 10 .0 ]
86
86
```
87
87
88
88
#### ssyr.ndarray( uplo, N, α, x, sx, ox, A, sa1, sa2, oa )
@@ -92,11 +92,11 @@ Performs the symmetric rank 1 operation `A = α*x*x^T + A`, using alternative in
92
92
``` javascript
93
93
var Float32Array = require ( ' @stdlib/array/float32' );
94
94
95
- var A = new Float32Array ( [ 1.0 , 2.0 , 3.0 , 0 .0 , 1.0 , 2.0 , 0 .0 , 0 .0 , 1.0 ] );
95
+ var A = new Float32Array ( [ 1.0 , 2.0 , 3.0 , 2 .0 , 1.0 , 2.0 , 3 .0 , 2 .0 , 1.0 ] );
96
96
var x = new Float32Array ( [ 1.0 , 2.0 , 3.0 ] );
97
97
98
98
ssyr .ndarray ( ' upper' , 3 , 1.0 , x, 1 , 0 , A , 3 , 1 , 0 );
99
- // A => <Float32Array>[ 2.0, 4.0, 6.0, 0 .0, 5.0, 8.0, 0 .0, 0 .0, 10.0 ]
99
+ // A => <Float32Array>[ 2.0, 4.0, 6.0, 2 .0, 5.0, 8.0, 3 .0, 2 .0, 10.0 ]
100
100
```
101
101
102
102
The function has the following additional parameters:
@@ -111,11 +111,11 @@ While [`typed array`][mdn-typed-array] views mandate a view offset based on the
111
111
``` javascript
112
112
var Float32Array = require ( ' @stdlib/array/float32' );
113
113
114
- var A = new Float32Array ( [ 1.0 , 2.0 , 3.0 , 0 .0 , 1.0 , 2.0 , 0 .0 , 0 .0 , 1.0 ] );
114
+ var A = new Float32Array ( [ 1.0 , 2.0 , 3.0 , 2 .0 , 1.0 , 2.0 , 3 .0 , 2 .0 , 1.0 ] );
115
115
var x = new Float32Array ( [ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 ] );
116
116
117
117
ssyr .ndarray ( ' upper' , 3 , 1.0 , x, - 2 , 4 , A , 3 , 1 , 0 );
118
- // A => <Float32Array>[ 26.0, 17.0, 8.0, 0 .0, 10.0, 5.0, 0 .0, 0 .0, 2.0 ]
118
+ // A => <Float32Array>[ 26.0, 17.0, 8.0, 2 .0, 10.0, 5.0, 3 .0, 2 .0, 2.0 ]
119
119
```
120
120
121
121
</section >
@@ -149,11 +149,18 @@ var opts = {
149
149
150
150
var N = 3 ;
151
151
152
- var A = ones ( N * N , opts .dtype );
152
+ // Create N-by-N symmetric matrices:
153
+ var A1 = ones ( N * N , opts .dtype );
154
+ var A2 = ones ( N * N , opts .dtype );
155
+
156
+ // Create a random vector:
153
157
var x = discreteUniform ( N , - 10.0 , 10.0 , opts );
154
158
155
- ssyr ( ' row-major' , ' upper' , 3 , 1.0 , x, 1 , A , 3 );
156
- console .log ( A );
159
+ ssyr ( ' row-major' , ' upper' , 3 , 1.0 , x, 1 , A1 , 3 );
160
+ console .log ( A1 );
161
+
162
+ ssyr .ndarray ( ' upper' , 3 , 1.0 , x, 1 , 0 , A2 , 3 , 1 , 0 );
163
+ console .log ( A2 );
157
164
```
158
165
159
166
</section >
@@ -186,62 +193,62 @@ console.log( A );
186
193
#include " stdlib/blas/base/ssyr.h"
187
194
```
188
195
189
- #### c_ssyr( order , uplo, N, alpha, \* X, strideX , \* A, LDA )
196
+ #### c_ssyr( layout , uplo, N, alpha, \* X, sx , \* A, LDA )
190
197
191
- Performs the symmetric rank 1 operation ` A = α*x*x^T + A ` .
198
+ Performs the symmetric rank 1 operation ` A = α*x*x^T + A ` where ` α ` is a scalar, ` x ` is an ` N ` element vector, and ` A ` is an ` N ` by ` N ` symmetric matrix .
192
199
193
200
``` c
194
201
#include " stdlib/blas/base/shared.h"
195
202
196
- float A[] = { 1.0f, 0.0f, 0.0f , 2.0f , 1.0f, 0.0f , 3.0f , 2.0f , 1.0f };
197
- const float x[ ] = { 1.0f , 2.0f , 3.0f };
203
+ float A[] = { 1.0, 2.0, 3.0 , 2.0 , 1.0, 2.0 , 3.0 , 2.0 , 1.0 };
204
+ const float x[ ] = { 1.0 , 2.0 , 3.0 };
198
205
199
- c_ssyr ( CblasColMajor, CblasUpper, 3, 1.0f , x, 1, A, 3 );
206
+ c_ssyr ( CblasColMajor, CblasUpper, 3, 1.0 , x, 1, A, 3 );
200
207
```
201
208
202
209
The function accepts the following arguments:
203
210
204
- - **order **: `[in] CBLAS_LAYOUT` storage layout.
211
+ - **layout **: `[in] CBLAS_LAYOUT` storage layout.
205
212
- **uplo**: `[in] CBLAS_UPLO` specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced.
206
213
- **N**: `[in] CBLAS_INT` number of elements along each dimension of `A`.
207
- - **alpha**: `[in] float` scalar.
214
+ - **alpha**: `[in] float` scalar constant .
208
215
- **X**: `[in] float*` input array.
209
- - **strideX **: `[in] CBLAS_INT` index increment for `X`.
216
+ - **sx **: `[in] CBLAS_INT` stride length for `X`.
210
217
- **A**: `[inout] float*` input matrix.
211
218
- **LDA**: `[in] CBLAS_INT` stride of the first dimension of `A` (a.k.a., leading dimension of the matrix `A`).
212
219
213
220
```c
214
- void c_ssyr( const CBLAS_LAYOUT order , const CBLAS_UPLO uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT strideX, float *A, const CBLAS_INT LDA )
221
+ void c_ssyr( const CBLAS_LAYOUT layout , const CBLAS_UPLO uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT strideX, float *A, const CBLAS_INT LDA )
215
222
```
216
223
217
- #### c_ssyr_ndarray( uplo, N, alpha, \* X, strideX, offsetX , \* A, sa1, sa2, oa )
224
+ #### c_ssyr_ndarray( uplo, N, alpha, \* X, sx, ox , \* A, sa1, sa2, oa )
218
225
219
- Performs the symmetric rank 1 operation ` A = α*x*x^T + A ` using alternative indexing semantics.
226
+ Performs the symmetric rank 1 operation ` A = α*x*x^T + A ` , using alternative indexing semantics and where ` α ` is a scalar, ` x ` is an ` N ` element vector, and ` A ` is an ` N ` by ` N ` symmetric matrix .
220
227
221
228
``` c
222
229
#include " stdlib/blas/base/shared.h"
223
230
224
- float A[] = { 1.0f , 2.0f , 3.0f, 0.0f , 1.0f , 2.0f, 0.0f, 0.0f , 1.0f };
225
- const float x[ ] = { 1.0f , 2.0f , 3.0f };
231
+ float A[] = { 1.0 , 2.0 , 3.0, 2.0 , 1.0 , 2.0, 3.0, 2.0 , 1.0 };
232
+ const float x[ ] = { 1.0 , 2.0 , 3.0 };
226
233
227
- c_ssyr_ndarray ( CblasUpper, 3, 1.0f , x, 1, 0, A, 3, 1, 0 );
234
+ c_ssyr_ndarray ( CblasUpper, 3, 1.0 , x, 1, 0, A, 3, 1, 0 );
228
235
```
229
236
230
237
The function accepts the following arguments:
231
238
232
239
- **uplo**: `[in] CBLAS_UPLO` specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced.
233
240
- **N**: `[in] CBLAS_INT` number of elements along each dimension of `A`.
234
- - **alpha**: `[in] float` scalar.
241
+ - **alpha**: `[in] float` scalar constant .
235
242
- **X**: `[in] float*` input array.
236
- - **strideX **: `[in] CBLAS_INT` index increment for `X`.
237
- - **offsetX **: `[in] CBLAS_INT` starting index for `X`.
243
+ - **sx **: `[in] CBLAS_INT` stride length for `X`.
244
+ - **ox **: `[in] CBLAS_INT` starting index for `X`.
238
245
- **A**: `[inout] float*` input matrix.
239
246
- **sa1**: `[in] CBLAS_INT` stride of the first dimension of `A`.
240
247
- **sa2**: `[in] CBLAS_INT` stride of the second dimension of `A`.
241
248
- **oa**: `[in] CBLAS_INT` starting index for `A`.
242
249
243
250
```c
244
- void c_ssyr_ndarray( const CBLAS_UPLO uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, float *A, const CBLAS_INT sa1 , const CBLAS_INT sa2 , const CBLAS_INT oa )
251
+ void c_ssyr_ndarray( const CBLAS_UPLO uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, float *A, const CBLAS_INT strideA1 , const CBLAS_INT strideA2 , const CBLAS_INT offsetA )
245
252
```
246
253
247
254
</section >
@@ -268,27 +275,39 @@ void c_ssyr_ndarray( const CBLAS_UPLO uplo, const CBLAS_INT N, const float alpha
268
275
#include < stdio.h>
269
276
270
277
int main ( void ) {
271
- // Create strided arrays:
272
- float A[ ] = { 1.0f, 0.0f, 0.0f, 2.0f, 1.0f, 0.0f, 3.0f, 2.0f, 1.0f };
273
- const float x[ ] = { 1.0f, 2.0f, 3.0f };
274
-
275
- // Specify the number of elements along each dimension of `A`:
278
+ // Define 3x3 symmetric matrices stored in row-major layout:
279
+ float A1[ 3* 3 ] = {
280
+ 1.0f, 2.0f, 3.0f,
281
+ 2.0f, 1.0f, 2.0f,
282
+ 3.0f, 2.0f, 1.0f
283
+ };
284
+
285
+ float A2[ 3*3 ] = {
286
+ 1.0f, 2.0f, 3.0f,
287
+ 2.0f, 1.0f, 2.0f,
288
+ 3.0f, 2.0f, 1.0f
289
+ };
290
+
291
+ // Define a vector:
292
+ const float x[ 3 ] = { 1.0f, 2.0f, 3.0f };
293
+
294
+ // Specify the number of elements along each dimension of `A1` and `A2`:
276
295
const int N = 3;
277
296
278
297
// Perform the symmetric rank 1 operation `A = α*x*x^T + A`:
279
- c_ssyr( CblasColMajor, CblasUpper, N, 1.0f, x, 1, A , N );
298
+ c_ssyr( CblasColMajor, CblasUpper, N, 1.0f, x, 1, A1 , N );
280
299
281
300
// Print the result:
282
301
for ( int i = 0; i < N*N; i++ ) {
283
- printf( "A [ %i ] = %f\n", i, A [ i ] );
302
+ printf( "A1 [ %i ] = %f\n", i, A1 [ i ] );
284
303
}
285
304
286
- // Perform the symmetric rank 1 operation `A = α*x*x^T + A`:
287
- c_ssyr_ndarray( CblasUpper, N, 1.0f , x, 1, 0, A , N, 1, 0 );
305
+ // Perform the symmetric rank 1 operation `A = α*x*x^T + A` using alternative indexing semantics :
306
+ c_ssyr_ndarray( CblasUpper, N, 1.0 , x, 1, 0, A2 , N, 1, 0 );
288
307
289
308
// Print the result:
290
309
for ( int i = 0; i < N*N; i++ ) {
291
- printf( "A [ %i ] = %f\n", i, A[ i ] );
310
+ printf( "A2 [ %i ] = %f\n", i, A[ i ] );
292
311
}
293
312
}
294
313
```
@@ -315,7 +334,7 @@ int main( void ) {
315
334
316
335
[blas]: http://www.netlib.org/blas
317
336
318
- [blas-ssyr]: https://www.netlib.org/lapack/explore-html/dc/d82/group__her_gad7585662770cdd3001ed08c7a864cd21 .html#gad7585662770cdd3001ed08c7a864cd21
337
+ [blas-ssyr]: https://www.netlib.org/lapack/explore-html-3.6.1/d6/d30/group__single__blas__level2_ga7b8a99048765ed2bf7c1e770bff0b622 .html
319
338
320
339
[mdn-float32array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float32Array
321
340
0 commit comments