zdrot
Applies a plane rotation.
Usage
var zdrot = require( '@stdlib/blas/base/zdrot' );
zdrot( N, zx, strideX, zy, strideY, c, s )
Applies a plane rotation.
var Complex128Array = require( '@stdlib/array/complex128' );
var real = require( '@stdlib/complex/float64/real' );
var imag = require( '@stdlib/complex/float64/imag' );
var zx = new Complex128Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] );
var zy = new Complex128Array( [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] );
zdrot( zx.length, zx, 1, zy, 1, 0.8, 0.6 );
var z = zy.get( 0 );
// returns <Complex128>
var re = real( z );
// returns ~-0.6
var im = imag( z );
// returns ~-1.2
z = zx.get( 0 );
// returns <Complex128>
re = real( z );
// returns ~0.8
im = imag( z );
// returns ~1.6
The function has the following parameters:
- N: number of indexed elements.
- zx: first input
Complex128Array
. - strideX: index increment for
zx
. - zy: second input
Complex128Array
. - strideY: index increment for
zy
.
The N
and stride parameters determine how values from zx
and zy
are accessed at runtime. For example, to apply a plane rotation to every other element,
var Complex128Array = require( '@stdlib/array/complex128' );
var real = require( '@stdlib/complex/float64/real' );
var imag = require( '@stdlib/complex/float64/imag' );
var zx = new Complex128Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] );
var zy = new Complex128Array( [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] );
zdrot( 2, zx, 2, zy, 2, 0.8, 0.6 );
var z = zy.get( 0 );
// returns <Complex128>
var re = real( z );
// returns ~-0.6
var im = imag( z );
// returns ~-1.2
z = zx.get( 0 );
// returns <Complex128>
re = real( z );
// returns ~0.8
im = imag( z );
// returns ~1.6
Note that indexing is relative to the first index. To introduce an offset, use typed array
views.
var Complex128Array = require( '@stdlib/array/complex128' );
var real = require( '@stdlib/complex/float64/real' );
var imag = require( '@stdlib/complex/float64/imag' );
// Initial arrays...
var zx0 = new Complex128Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] );
var zy0 = new Complex128Array( [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] );
// Create offset views...
var zx1 = new Complex128Array( zx0.buffer, zx0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
var zy1 = new Complex128Array( zy0.buffer, zy0.BYTES_PER_ELEMENT*2 ); // start at 3rd element
zdrot( 2, zx1, -2, zy1, 1, 0.8, 0.6 );
var z = zy0.get( 2 );
// returns <Complex128>
var re = real( z );
// returns ~-4.2
var im = imag( z );
// returns ~-4.8
z = zx0.get( 3 );
// returns <Complex128>
re = real( z );
// returns ~5.6
im = imag( z );
// returns ~6.4
zdrot.ndarray( N, zx, strideX, offsetX, zy, strideY, offsetY, c, s )
Applies a plane rotation using alternative indexing semantics.
var Complex128Array = require( '@stdlib/array/complex128' );
var real = require( '@stdlib/complex/float64/real' );
var imag = require( '@stdlib/complex/float64/imag' );
var zx = new Complex128Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] );
var zy = new Complex128Array( [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] );
zdrot.ndarray( zx.length, zx, 1, 0, zy, 1, 0, 0.8, 0.6 );
var z = zy.get( 0 );
// returns <Complex128>
var re = real( z );
// returns ~-0.6
var im = imag( z );
// returns ~-1.2
z = zx.get( 0 );
// returns <Complex128>
re = real( z );
// returns ~0.8
im = imag( z );
// returns ~1.6
The function has the following additional parameters:
- offsetX: starting index for
zx
. - offsetY: starting index for
zy
.
While typed array
views mandate a view offset based on the underlying buffer, the offset parameters support indexing semantics based on starting indices. For example, to apply a plane rotation to every other element starting from the second element,
var Complex128Array = require( '@stdlib/array/complex128' );
var real = require( '@stdlib/complex/float64/real' );
var imag = require( '@stdlib/complex/float64/imag' );
var zx = new Complex128Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] );
var zy = new Complex128Array( [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] );
zdrot.ndarray( 2, zx, 2, 1, zy, 2, 1, 0.8, 0.6 );
var z = zy.get( 3 );
// returns <Complex128>
var re = real( z );
// returns ~-4.2
var im = imag( z );
// returns ~-4.8
z = zx.get( 1 );
// returns <Complex128>
re = real( z );
// returns ~2.4
im = imag( z );
// returns ~3.2
Notes
Examples
var discreteUniform = require( '@stdlib/random/base/discrete-uniform' );
var filledarrayBy = require( '@stdlib/array/filled-by' );
var Complex128 = require( '@stdlib/complex/float64/ctor' );
var zcopy = require( '@stdlib/blas/base/zcopy' );
var zeros = require( '@stdlib/array/zeros' );
var logEach = require( '@stdlib/console/log-each' );
var zdrot = require( '@stdlib/blas/base/zdrot' );
function rand() {
return new Complex128( discreteUniform( 0, 10 ), discreteUniform( -5, 5 ) );
}
// Generate random input arrays:
var zx = filledarrayBy( 10, 'complex128', rand );
var zxc = zcopy( zx.length, zx, 1, zeros( zx.length, 'complex128' ), 1 );
var zy = filledarrayBy( 10, 'complex128', rand );
var zyc = zcopy( zy.length, zy, 1, zeros( zy.length, 'complex128' ), 1 );
// Apply a plane rotation:
zdrot( zx.length, zx, 1, zy, 1, 0.8, 0.6 );
// Print the results:
logEach( '(%s,%s) => (%s,%s)', zxc, zyc, zx, zy );
C APIs
Usage
#include "stdlib/blas/base/zdrot.h"
c_zdrot( N, *X, strideX, *Y, strideY, c, s )
Applies a plane rotation.
double x[] = { 1.0, 2.0, 3.0, 4.0 }; // interleaved real and imaginary components
double y[] = { 5.0, 6.0, 7.0, 8.0 };
c_zdrot( 2, (void *)x, 1, (void *)y, 1, 0.8, 0.6 );
The function accepts the following arguments:
- N:
[in] CBLAS_INT
number of indexed elements. - zx:
[inout] void*
first input array. - strideX:
[in] CBLAS_INT
index increment forzx
. - zy:
[inout] void*
second input array. - strideY:
[in] CBLAS_INT
index increment forzy
. - c:
[in] double
cosine of the angle of rotation. - s:
[in] double
sine of the angle of rotation.
void c_zdrot( const CBLAS_INT N, void *X, const CBLAS_INT strideX, void *Y, const CBLAS_INT strideY, const double c, const double s );
c_zdrot_ndarray( N, *X, strideX, offsetX, *Y, strideY, offsetY, c, s )
Applies a plane rotation using alternative indexing semantics.
double x[] = { 1.0, 2.0, 3.0, 4.0 }; // interleaved real and imaginary components
double y[] = { 5.0, 6.0, 7.0, 8.0 };
c_zdrot_ndarray( 2, (void *)x, 1, 0, (void *)y, 1, 0, 0.8, 0.6 );
The function accepts the following arguments:
- N:
[in] CBLAS_INT
number of indexed elements. - zx:
[inout] void*
first input array. - strideX:
[in] CBLAS_INT
index increment forzx
. - offsetX:
[in] CBLAS_INT
starting index forzx
. - zy:
[inout] void*
second input array. - strideY:
[in] CBLAS_INT
index increment forzy
. - offsetY:
[in] CBLAS_INT
starting index forzy
. - c:
[in] double
cosine of the angle of rotation. - s:
[in] double
sine of the angle of rotation.
void c_zdrot_ndarray( const CBLAS_INT N, void *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, void *Y, const CBLAS_INT strideY, const CBLAS_INT offsetY, const double c, const double s );
Examples
#include "stdlib/blas/base/zdrot.h"
#include <stdio.h>
int main( void ) {
// Create strided arrays:
double zx[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 };
double zy[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
// Specify the number of elements:
const int N = 4;
// Specify stride lengths:
const int strideX = 1;
const int strideY = -1;
// Copy elements:
c_zdrot( N, (void *)zx, strideX, (void *)zy, strideY, 0.8, 0.6 );
// Print the result:
for ( int i = 0; i < N; i++ ) {
printf( "zx[ %i ] = %lf + %lfj\n", i, zx[ i*2 ], zx[ (i*2)+1 ] );
printf( "zy[ %i ] = %lf + %lfj\n", i, zy[ i*2 ], zy[ (i*2)+1 ] );
}
}