What does the randperm function do in MATLAB / RunMat?
randperm(n) returns a uniformly random permutation of the integers 1:n.
randperm(n, k) selects k unique integers from 1:n without replacement.
RunMat mirrors MATLAB's behaviour, including RNG seeding through rng, GPU-aware
'like' prototypes, and deterministic results during testing.
How does the randperm function behave in MATLAB / RunMat?
randperm(n)produces a row vector whose length isnand whose entries are a random ordering of1:n.randperm(n, k)returns the firstkentries of the permutation without replacement (0 ≤ k ≤ n). The result is a1 × krow vector.randperm(n, ___, 'like', A)matches the numeric class and residency ofAwhen possible (e.g., GPU tensors).randperm(n, ___, 'double')keeps the default double-precision output.randpermerrors whennorkare non-integers, negative, or exceed the IEEEdoubleinteger precision limit (2^53).- Empty permutations (e.g.,
randperm(0)orrandperm(n, 0)) return a1×0tensor.
randperm Function GPU Execution Behaviour
When the 'like' prototype lives on the GPU, RunMat asks the active
acceleration provider for a device-side permutation via the dedicated
random_permutation_like hook. The bundled WGPU provider executes the entire
selection and shuffle in a compute kernel, keeping the data resident on the
device. Providers that do not advertise this hook fall back to the host
implementation and upload the result once, preserving correctness while
highlighting the extra transfer cost.
Examples of using the randperm function in MATLAB / RunMat
Getting a random permutation of integers 1 through N
rng(0);
p = randperm(6);
Expected output (with rng(0)):
p = [1 6 2 4 3 5];
Selecting K unique indices without replacement
rng(0);
idx = randperm(10, 3);
Expected output (with rng(0)):
idx = [1 10 9];
Generating a reproducible permutation after seeding RNG
rng(42);
p1 = randperm(8);
rng(42);
p2 = randperm(8);
Expected output:
isequal(p1, p2)
ans = logical
1
Creating a GPU-resident random permutation
G = gpuArray.zeros(4, 4);
p = randperm(12, 4, 'like', G);
peek = gather(p);
Expected behaviour:
isa(p, 'gpuArray')
ans = logical
1
Working with empty permutations
p = randperm(0);
q = randperm(5, 0);
Expected output:
size(p)
ans =
1 0
size(q)
ans =
1 0
GPU residency in RunMat (Do I need gpuArray?)
You usually do NOT need to call gpuArray yourself in RunMat (unlike MATLAB).
In RunMat, the fusion planner and acceleration layer keep residency on the GPU
whenever downstream computation benefits from it. When you request a
permutation 'like' a GPU tensor, RunMat asks the active acceleration provider
to generate and shuffle the permutation directly on the device. If the provider
does not implement the permutation hook, RunMat falls back to host generation
and performs a single upload so later GPU work still sees a device-resident
array.
To preserve backwards compatibility with MathWorks MATLAB—and for situations
where you want to be explicit—you can always wrap inputs in gpuArray.
FAQ
What ranges does randperm draw from?
randperm(n) always returns integers in the inclusive range 1:n. The optional
second argument k picks the first k elements of that permutation.
Can k be zero?
Yes. randperm(n, 0) returns a 1×0 empty row vector without consuming any
additional random numbers.
Does randperm support 'single' or integer output types?
Not yet. The builtin currently emits double-precision arrays. Supplying
'single' or integer class names raises a descriptive error.
How does randperm interact with rng?
randperm consumes the shared RunMat RNG stream. Use the MATLAB-compatible
rng builtin to seed or restore the generator for reproducible permutations.
Why is there a 2^53 limit?
All outputs are stored in IEEE double. Values beyond 2^53 cannot be
represented exactly, so RunMat rejects inputs larger than 2^53 to avoid
duplicate entries.
Does the GPU path stay device-resident?
Yes—when a provider is active RunMat uploads the host permutation after it is generated. Providers that later add a dedicated permutation kernel can replace the fallback without changing user code.
See Also
rand, randi, rng, gpuArray, gather
Source & Feedback
- The full source code for the implementation of the
randpermfunction is available at:crates/runmat-runtime/src/builtins/array/creation/randperm.rs - Found a bug or behavioural difference? Please open an issue with details and a minimal repro.