github.com/gopherd/gonum@v0.0.4/dsp/fourier/internal/fftpack/array_no_bounds_checks.go (about)

     1  // Copyright ©2018 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // This file must be kept in sync with array_bound_checks.go.
     6  
     7  //go:build !bounds
     8  // +build !bounds
     9  
    10  package fftpack
    11  
    12  // The types in array.go implement Fortran-like arrays for bootstrapping
    13  // the implementation of the FFT functions translated from FFTPACK; they
    14  // are column-major.
    15  
    16  type twoArray struct {
    17  	jStride int
    18  	data    []float64
    19  }
    20  
    21  func newTwoArray(i, j int, data []float64) twoArray {
    22  	if len(data) < i*j {
    23  		panic("fourier: short data")
    24  	}
    25  	return twoArray{
    26  		jStride: i,
    27  		data:    data[:i*j],
    28  	}
    29  }
    30  
    31  func (a twoArray) at(i, j int) float64 {
    32  	return a.data[i+a.jStride*j]
    33  }
    34  
    35  func (a twoArray) atCmplx(i, j int) complex128 {
    36  	return complex(a.data[i+a.jStride*j], a.data[i+a.jStride*j+1])
    37  }
    38  
    39  func (a twoArray) set(i, j int, v float64) {
    40  	a.data[i+a.jStride*j] = v
    41  }
    42  
    43  func (a twoArray) setCmplx(i, j int, v complex128) {
    44  	a.data[i+a.jStride*j] = real(v)
    45  	a.data[i+a.jStride*j+1] = imag(v)
    46  }
    47  
    48  func (a twoArray) add(i, j int, v float64) {
    49  	a.data[i+a.jStride*j] += v
    50  }
    51  
    52  type threeArray struct {
    53  	jStride, kStride int
    54  	data             []float64
    55  }
    56  
    57  func newThreeArray(i, j, k int, data []float64) threeArray {
    58  	if len(data) < i*j*k {
    59  		panic("fourier: short data")
    60  	}
    61  	return threeArray{
    62  		jStride: i,
    63  		kStride: i * j,
    64  		data:    data[:i*j*k],
    65  	}
    66  }
    67  
    68  func (a threeArray) at(i, j, k int) float64 {
    69  	return a.data[i+a.jStride*j+a.kStride*k]
    70  }
    71  
    72  func (a threeArray) atCmplx(i, j, k int) complex128 {
    73  	return complex(a.data[i+a.jStride*j+a.kStride*k], a.data[i+a.jStride*j+a.kStride*k+1])
    74  }
    75  
    76  func (a threeArray) set(i, j, k int, v float64) {
    77  	a.data[i+a.jStride*j+a.kStride*k] = v
    78  }
    79  
    80  func (a threeArray) setCmplx(i, j, k int, v complex128) {
    81  	a.data[i+a.jStride*j+a.kStride*k] = real(v)
    82  	a.data[i+a.jStride*j+a.kStride*k+1] = imag(v)
    83  }