cannam@127: cannam@127: cannam@127: cannam@127: cannam@127:
cannam@127:cannam@127: Next: Column-major Format, Previous: Multi-dimensional Array Format, Up: Multi-dimensional Array Format [Contents][Index]
cannam@127:The multi-dimensional arrays passed to fftw_plan_dft
etcetera
cannam@127: are expected to be stored as a single contiguous block in
cannam@127: row-major order (sometimes called “C order”). Basically, this
cannam@127: means that as you step through adjacent memory locations, the first
cannam@127: dimension’s index varies most slowly and the last dimension’s index
cannam@127: varies most quickly.
cannam@127:
To be more explicit, let us consider an array of rank d whose cannam@127: dimensions are n0 × n1 × n2 × … × nd-1. Now, we specify a location in the array by a cannam@127: sequence of d (zero-based) indices, one for each dimension: cannam@127: (i0, i1, i2,..., id-1).If the array is stored in row-major cannam@127: order, then this element is located at the position cannam@127: id-1 + nd-1 * (id-2 + nd-2 * (... + n1 * i0)).
cannam@127:Note that, for the ordinary complex DFT, each element of the array
cannam@127: must be of type fftw_complex
; i.e. a (real, imaginary) pair of
cannam@127: (double-precision) numbers.
cannam@127:
In the advanced FFTW interface, the physical dimensions n from cannam@127: which the indices are computed can be different from (larger than) cannam@127: the logical dimensions of the transform to be computed, in order to cannam@127: transform a subset of a larger array. cannam@127: cannam@127: Note also that, in the advanced interface, the expression above is cannam@127: multiplied by a stride to get the actual array index—this is cannam@127: useful in situations where each element of the multi-dimensional array cannam@127: is actually a data structure (or another array), and you just want to cannam@127: transform a single field. In the basic interface, however, the stride cannam@127: is 1. cannam@127: cannam@127:
cannam@127: cannam@127: cannam@127: cannam@127: cannam@127: