-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
feat: add ndarray/base/reinterpret-complex
#11779
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,118 @@ | ||
| <!-- | ||
|
|
||
| @license Apache-2.0 | ||
|
|
||
| Copyright (c) 2026 The Stdlib Authors. | ||
|
|
||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||
| you may not use this file except in compliance with the License. | ||
| You may obtain a copy of the License at | ||
|
|
||
| http://www.apache.org/licenses/LICENSE-2.0 | ||
|
|
||
| Unless required by applicable law or agreed to in writing, software | ||
| distributed under the License is distributed on an "AS IS" BASIS, | ||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| See the License for the specific language governing permissions and | ||
| limitations under the License. | ||
|
|
||
| --> | ||
|
|
||
| # reinterpret | ||
|
|
||
| > Reinterpret a complex-valued floating-point [ndarray][@stdlib/ndarray/base/ctor] as a real-valued floating-point [ndarray][@stdlib/ndarray/base/ctor] having the same precision. | ||
|
|
||
| <section class="intro"> | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.intro --> | ||
|
|
||
| <section class="usage"> | ||
|
|
||
| ## Usage | ||
|
|
||
| ```javascript | ||
| var reinterpretComplex = require( '@stdlib/ndarray/base/reinterpret-complex' ); | ||
| ``` | ||
|
|
||
| #### reinterpretComplex( x ) | ||
|
|
||
| Reinterprets a complex-valued floating-point [ndarray][@stdlib/ndarray/base/ctor] as a real-valued floating-point [ndarray][@stdlib/ndarray/base/ctor] having the same precision. | ||
|
|
||
| ```javascript | ||
| var ones = require( '@stdlib/ndarray/base/ones' ); | ||
|
|
||
| var x = ones( 'complex128', [ 2, 2 ], 'row-major' ); | ||
| // returns <ndarray>[ [ <Complex128>[ 1.0, 0.0 ], <Complex128>[ 1.0, 0.0 ] ], [ <Complex128>[ 1.0, 0.0 ], <Complex128>[ 1.0, 0.0 ] ] ] | ||
|
|
||
| var out = reinterpretComplex( x ); | ||
| // returns <ndarray>[ [ [ 1.0, 0.0 ], [ 1.0, 0.0 ] ], [ [ 1.0, 0.0 ], [ 1.0, 0.0 ] ] ] | ||
| ``` | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.usage --> | ||
|
|
||
| <section class="notes"> | ||
|
|
||
| ## Notes | ||
|
|
||
| - If provided an [ndarray][@stdlib/ndarray/base/ctor] whose underlying data buffer is neither a `Complex128Array` nor a `Complex64Array`, the function returns the input [ndarray][@stdlib/ndarray/base/ctor] unchanged. | ||
| - The returned [ndarray][@stdlib/ndarray/base/ctor] is a view on the input [ndarray][@stdlib/ndarray/base/ctor] data buffer. | ||
| - The returned [ndarray][@stdlib/ndarray/base/ctor] has an additional trailing dimension of size two whose elements correspond to the real and imaginary components, respectively, of each complex-valued element in the input [ndarray][@stdlib/ndarray/base/ctor]. | ||
| - The returned [ndarray][@stdlib/ndarray/base/ctor] is a "base" [ndarray][@stdlib/ndarray/base/ctor], and, thus, the returned [ndarray][@stdlib/ndarray/base/ctor] does not perform bounds checking or afford any of the guarantees of the non-base [ndarray][@stdlib/ndarray/ctor] constructor. The primary intent of this function is to reinterpret an ndarray-like object within internal implementations and to do so with minimal overhead. | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.notes --> | ||
|
|
||
| <section class="examples"> | ||
|
|
||
| ## Examples | ||
|
|
||
| <!-- eslint no-undef: "error" --> | ||
|
|
||
| ```javascript | ||
| var discreteUniform = require( '@stdlib/random/array/discrete-uniform' ); | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This example should be updated. |
||
| var Complex128Array = require( '@stdlib/array/complex128' ); | ||
| var ndarray = require( '@stdlib/ndarray/base/ctor' ); | ||
| var ndarray2array = require( '@stdlib/ndarray/to-array' ); | ||
| var reinterpretComplex = require( '@stdlib/ndarray/base/reinterpret-complex' ); | ||
|
|
||
| // Create a double-precision complex floating-point ndarray: | ||
| var buf = new Complex128Array( discreteUniform( 8, -5, 5 ) ); | ||
| var x = ndarray( 'complex128', buf, [ 2, 2 ], [ 2, 1 ], 0, 'row-major' ); | ||
|
|
||
| // Reinterpret as a double-precision floating-point ndarray: | ||
| var out = reinterpretComplex( x ); | ||
| console.log( ndarray2array( out ) ); | ||
| ``` | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.examples --> | ||
|
|
||
| <section class="references"> | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.references --> | ||
|
|
||
| <!-- Section for related `stdlib` packages. Do not manually edit this section, as it is automatically populated. --> | ||
|
|
||
| <section class="related"> | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.related --> | ||
|
|
||
| <section class="links"> | ||
|
|
||
| [@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/ctor | ||
|
|
||
| [@stdlib/ndarray/base/ctor]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/ctor | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.links --> | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,198 @@ | ||
| /** | ||
| * @license Apache-2.0 | ||
| * | ||
| * Copyright (c) 2026 The Stdlib Authors. | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
|
|
||
| 'use strict'; | ||
|
|
||
| // MODULES // | ||
|
|
||
| var bench = require( '@stdlib/bench' ); | ||
| var Complex128Array = require( '@stdlib/array/complex128' ); | ||
| var Complex64Array = require( '@stdlib/array/complex64' ); | ||
| var ndarrayBase = require( '@stdlib/ndarray/base/ctor' ); | ||
| var ndarray = require( '@stdlib/ndarray/ctor' ); | ||
| var isndarrayLike = require( '@stdlib/assert/is-ndarray-like' ); | ||
| var format = require( '@stdlib/string/format' ); | ||
| var pkg = require( './../package.json' ).name; | ||
| var reinterpretComplex = require( './../lib' ); | ||
|
|
||
|
|
||
| // MAIN // | ||
|
|
||
| bench( format( '%s::base_ndarray:dtype=complex128', pkg ), function benchmark( b ) { | ||
| var strides; | ||
| var values; | ||
| var buffer; | ||
| var offset; | ||
| var dtype; | ||
| var shape; | ||
| var order; | ||
| var out; | ||
| var i; | ||
|
|
||
| dtype = 'complex128'; | ||
| buffer = new Complex128Array( 4 ); | ||
| shape = [ 2, 2 ]; | ||
| strides = [ 2, 1 ]; | ||
| offset = 0; | ||
| order = 'row-major'; | ||
|
|
||
| values = [ | ||
| ndarrayBase( dtype, buffer, shape, strides, offset, order ), | ||
| ndarrayBase( dtype, buffer, shape, strides, offset, order ), | ||
| ndarrayBase( dtype, buffer, shape, strides, offset, order ), | ||
| ndarrayBase( dtype, buffer, shape, strides, offset, order ), | ||
| ndarrayBase( dtype, buffer, shape, strides, offset, order ) | ||
| ]; | ||
|
|
||
| b.tic(); | ||
| for ( i = 0; i < b.iterations; i++ ) { | ||
| out = reinterpretComplex( values[ i%values.length ] ); | ||
| if ( typeof out !== 'object' ) { | ||
| b.fail( 'should return an object' ); | ||
| } | ||
| } | ||
| b.toc(); | ||
| if ( !isndarrayLike( out ) ) { | ||
| b.fail( 'should return an ndarray' ); | ||
| } | ||
| b.pass( 'benchmark finished' ); | ||
| b.end(); | ||
| }); | ||
|
|
||
| bench( format( '%s::ndarray:dtype=complex128', pkg ), function benchmark( b ) { | ||
| var strides; | ||
| var values; | ||
| var buffer; | ||
| var offset; | ||
| var dtype; | ||
| var shape; | ||
| var order; | ||
| var out; | ||
| var i; | ||
|
|
||
| dtype = 'complex128'; | ||
| buffer = new Complex128Array( 4 ); | ||
| shape = [ 2, 2 ]; | ||
| strides = [ 2, 1 ]; | ||
| offset = 0; | ||
| order = 'row-major'; | ||
|
|
||
| values = [ | ||
| ndarray( dtype, buffer, shape, strides, offset, order ), | ||
| ndarray( dtype, buffer, shape, strides, offset, order ), | ||
| ndarray( dtype, buffer, shape, strides, offset, order ), | ||
| ndarray( dtype, buffer, shape, strides, offset, order ), | ||
| ndarray( dtype, buffer, shape, strides, offset, order ) | ||
| ]; | ||
|
|
||
| b.tic(); | ||
| for ( i = 0; i < b.iterations; i++ ) { | ||
| out = reinterpretComplex( values[ i%values.length ] ); | ||
| if ( typeof out !== 'object' ) { | ||
| b.fail( 'should return an object' ); | ||
| } | ||
| } | ||
| b.toc(); | ||
| if ( !isndarrayLike( out ) ) { | ||
| b.fail( 'should return an ndarray' ); | ||
| } | ||
| b.pass( 'benchmark finished' ); | ||
| b.end(); | ||
| }); | ||
|
|
||
| bench( format( '%s::base_ndarray:dtype=complex64', pkg ), function benchmark( b ) { | ||
| var strides; | ||
| var values; | ||
| var buffer; | ||
| var offset; | ||
| var dtype; | ||
| var shape; | ||
| var order; | ||
| var out; | ||
| var i; | ||
|
|
||
| dtype = 'complex64'; | ||
| buffer = new Complex64Array( 4 ); | ||
| shape = [ 2, 2 ]; | ||
| strides = [ 2, 1 ]; | ||
| offset = 0; | ||
| order = 'row-major'; | ||
|
|
||
| values = [ | ||
| ndarrayBase( dtype, buffer, shape, strides, offset, order ), | ||
| ndarrayBase( dtype, buffer, shape, strides, offset, order ), | ||
| ndarrayBase( dtype, buffer, shape, strides, offset, order ), | ||
| ndarrayBase( dtype, buffer, shape, strides, offset, order ), | ||
| ndarrayBase( dtype, buffer, shape, strides, offset, order ) | ||
| ]; | ||
|
|
||
| b.tic(); | ||
| for ( i = 0; i < b.iterations; i++ ) { | ||
| out = reinterpretComplex( values[ i%values.length ] ); | ||
| if ( typeof out !== 'object' ) { | ||
| b.fail( 'should return an object' ); | ||
| } | ||
| } | ||
| b.toc(); | ||
| if ( !isndarrayLike( out ) ) { | ||
| b.fail( 'should return an ndarray' ); | ||
| } | ||
| b.pass( 'benchmark finished' ); | ||
| b.end(); | ||
| }); | ||
|
|
||
| bench( format( '%s::ndarray:dtype=complex64', pkg ), function benchmark( b ) { | ||
| var strides; | ||
| var values; | ||
| var buffer; | ||
| var offset; | ||
| var dtype; | ||
| var shape; | ||
| var order; | ||
| var out; | ||
| var i; | ||
|
|
||
| dtype = 'complex64'; | ||
| buffer = new Complex64Array( 4 ); | ||
| shape = [ 2, 2 ]; | ||
| strides = [ 2, 1 ]; | ||
| offset = 0; | ||
| order = 'row-major'; | ||
|
|
||
| values = [ | ||
| ndarray( dtype, buffer, shape, strides, offset, order ), | ||
| ndarray( dtype, buffer, shape, strides, offset, order ), | ||
| ndarray( dtype, buffer, shape, strides, offset, order ), | ||
| ndarray( dtype, buffer, shape, strides, offset, order ), | ||
| ndarray( dtype, buffer, shape, strides, offset, order ) | ||
| ]; | ||
|
|
||
| b.tic(); | ||
| for ( i = 0; i < b.iterations; i++ ) { | ||
| out = reinterpretComplex( values[ i%values.length ] ); | ||
| if ( typeof out !== 'object' ) { | ||
| b.fail( 'should return an object' ); | ||
| } | ||
| } | ||
| b.toc(); | ||
| if ( !isndarrayLike( out ) ) { | ||
| b.fail( 'should return an ndarray' ); | ||
| } | ||
| b.pass( 'benchmark finished' ); | ||
| b.end(); | ||
| }); |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,41 @@ | ||||||
|
|
||||||
| {{alias}}( x ) | ||||||
| Reinterprets a complex-valued floating-point ndarray as a real-valued | ||||||
| floating-point ndarray having the same precision. | ||||||
|
|
||||||
| If provided an ndarray whose underlying data buffer is neither a | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same comment. |
||||||
| Complex128Array nor a Complex64Array, the function returns the input | ||||||
| ndarray unchanged. | ||||||
|
|
||||||
| The returned ndarray is a view on the input ndarray data buffer. | ||||||
|
|
||||||
| The returned ndarray has an additional trailing dimension of size two whose | ||||||
| elements correspond to the real and imaginary components, respectively, of | ||||||
| each complex-valued element in the input ndarray. | ||||||
|
|
||||||
| The returned ndarray is a "base" ndarray, and, thus, the returned ndarray | ||||||
| does not perform bounds checking or afford any of the guarantees of the | ||||||
| non-base ndarray constructor. The primary intent of this function is to | ||||||
| reinterpret an ndarray-like object within internal implementations and to | ||||||
| do so with minimal overhead. | ||||||
|
|
||||||
| Parameters | ||||||
| ---------- | ||||||
| x: ndarray | ||||||
| Input ndarray. | ||||||
|
|
||||||
| Returns | ||||||
| ------- | ||||||
| out: ndarray | ||||||
| Real-valued floating-point ndarray view. | ||||||
|
|
||||||
| Examples | ||||||
| -------- | ||||||
| > var dt = 'complex128'; | ||||||
| > var x = {{alias:@stdlib/ndarray/base/zeros}}( dt, [ 2, 2 ], 'row-major' ); | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's try to use top-level utilities in examples and benchmarks, where possible. |
||||||
| > var out = {{alias}}( x ) | ||||||
| <ndarray>[ [ [ 0.0, 0.0 ], [ 0.0, 0.0 ] ], [ [ 0.0, 0.0 ], [ 0.0, 0.0 ] ] ] | ||||||
|
|
||||||
| See Also | ||||||
| -------- | ||||||
|
|
||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This note should be removed.