What does the ifftshift function do in MATLAB / RunMat?
ifftshift(X) circularly shifts data so that the DC (zero-frequency) component
returns to index 1 along each transformed dimension. It is the inverse of
fftshift and is commonly used immediately before calling ifft.
How does the ifftshift function behave in MATLAB / RunMat?
- 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.
ifftshift Function GPU Execution Behaviour
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.
Examples of using the ifftshift function in MATLAB / RunMat
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);
Expected behaviour: restored matches fx and signal equals the original
time-domain data (within floating-point tolerance).
Shifting only selected dimensions
A = reshape(1:12, 3, 4);
rowsShifted = ifftshift(A, 1); % shift rows only
colsShifted = ifftshift(A, 2); % shift columns only
Expected 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 6
Using 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];
GPU residency in RunMat (Do I need gpuArray?)
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.
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.
See Also
fftshift, fft, ifft, circshift, gpuArray, gather
Source & Feedback
- Source:
crates/runmat-runtime/src/builtins/math/fft/ifftshift.rs - Found a bug? Open an issue with details and a minimal repro.