ifftshift — Shift centered spectra back to origin ordering in MATLAB and RunMat.
ifftshift(X) circularly shifts data so zero-frequency components move back to origin ordering. Default and dimension-specific shifting behavior follow MATLAB semantics.
Syntax
Y = ifftshift(X)
Y = ifftshift(X, DIM)Inputs
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
X | Any | Yes | — | Numeric, complex, logical, or gpuArray input. |
DIM | Any | No | [] | Dimension selector (scalar, numeric vector, or logical mask vector). |
Returns
| Name | Type | Description |
|---|---|---|
Y | Any | Shifted array with the same size and type family as X. |
Errors
| Identifier | When | Message |
|---|---|---|
RunMat:ifftshift:ArgCount | More than two input arguments are supplied. | ifftshift: invalid argument count |
RunMat:ifftshift:InvalidDimensions | DIM argument is malformed or out of range. | ifftshift: invalid dimension argument |
RunMat:ifftshift:InvalidInput | X is not a supported numeric/logical input type. | ifftshift: expected numeric or logical input |
RunMat:ifftshift:UnsupportedInput | X is an unsupported object/cell/function/meta runtime type. | ifftshift: unsupported input type |
RunMat:ifftshift:Internal | Shifting, tensor reconstruction, or GPU transfer operations fail. | ifftshift: internal error |
How ifftshift works
- When no dimensions are specified, every axis is shifted by
ceil(size(X, dim) / 2). - Passing a list of dimensions restricts shifting to those axes; zeros and ones are treated as no-ops.
- Odd-length dimensions shift by one additional element compared with
fftshift, matching MATLAB'sifftshiftparity rules. - Works for real, complex, logical, and GPU-resident tensors.
- Empty arrays and scalars are returned unchanged.
Does RunMat run ifftshift on the GPU?
RunMat first attempts to execute the shift entirely on the GPU using the provider's circshift hook. If that is unavailable, RunMat gathers the data exactly once, performs the reorder on the host, and uploads the result so downstream computations can continue on the device. Scalars remain on their current device to avoid unnecessary transfers.
GPU memory and residency
You can rely on RunMat's auto-offload to keep FFT data on the GPU. When a provider exposes circshift, ifftshift executes entirely on the device and the result remains GPU-resident. If no provider is registered—or it lacks circshift—RunMat gathers once, applies the host reorder, and uploads the result so the rest of the computation can still run accelerated. You can call gpuArray explicitly when you need MATLAB parity or to enforce a residency boundary.
Examples
Undoing fftshift on an even-length spectrum
x = 0:7;
y = ifftshift(x)Expected output:
y = [4 5 6 7 0 1 2 3]Undoing fftshift on an odd-length spectrum
x = 1:5;
y = ifftshift(x)Expected output:
y = [3 4 5 1 2]Preparing data for inverse FFT
fx = fft(rand(1, 8));
centered = fftshift(fx);
restored = ifftshift(centered);
signal = ifft(restored)Shifting only selected dimensions
A = reshape(1:12, 3, 4);
rowsShifted = ifftshift(A, 1); % shift rows only
colsShifted = ifftshift(A, 2); % shift columns onlyExpected output:
rowsShifted =
2 5 8 11
3 6 9 12
1 4 7 10
colsShifted =
7 10 1 4
8 11 2 5
9 12 3 6Using ifftshift with gpuArray data
G = gpuArray(0:7);
shifted = ifftshift(G);
host = gather(shifted)Expected output:
host = [4 5 6 7 0 1 2 3]Using ifftshift with coding agents
Open a RunMat example with live inputs, then ask the agent to explain how ifftshift changes the result.
Run a small ifftshift example, explain the result, then change one input and compare the output.
FAQ
When should I call ifftshift?⌄
Call ifftshift right before ifft (or ifftn) after you have applied fftshift-based processing in the frequency domain. It restores the DC component to index 1.
Is ifftshift always the inverse of fftshift?⌄
Yes. For any supported input, ifftshift(fftshift(X)) returns X, including odd-length dimensions where the shift counts differ.
Does ifftshift modify data values?⌄
No. It only reorders elements. Magnitudes, phases, and overall content stay the same.
Can I restrict ifftshift to specific axes?⌄
Yes. Pass a dimension index, vector of indices, or logical mask exactly like in MATLAB.
Does ifftshift support gpuArray inputs?⌄
Yes. RunMat keeps GPU data on-device whenever possible and falls back to a single gather/upload cycle otherwise.
Related Math functions
Elementwise
abs · angle · complex · conj · double · exp · expm1 · factorial · gamma · hypot · imag · ldivide · log · log10 · log1p · log2 · minus · nextpow2 · plus · pow2 · power · rdivide · real · sign · single · sqrt · times
Trigonometry
acos · acosh · asin · asinh · atan · atan2 · atanh · cos · cosd · cosh · deg2rad · rad2deg · sin · sind · sinh · tan · tand · tanh
Reduction
all · any · cummax · cummin · cumprod · cumsum · cumtrapz · diff · gradient · max · mean · median · min · nnz · prod · std · sum · trapz · var
Structure
Open-source implementation
Unlike proprietary runtimes, every RunMat function is open-source. Read exactly how ifftshift is executed, line by line, in Rust.
- View the source for ifftshift in Rust on GitHub
- Learn how the RunMat runtime works
- Found a bug? Open an issue with a minimal reproduction.
About RunMat
RunMat is an open-source runtime that executes MATLAB-syntax code blazing on any GPU. It is licensed under the Apache 2.0 license.
- RunMat automatically optimizes your math for GPU execution on Apple, Nvidia, and AMD hardware. No code changes needed. Simulations that took hours now take minutes.
- Start running code in seconds. RunMat runs in the browser, on the desktop, or from the CLI. No license server, no IT ticket.