What does the le function do in MATLAB / RunMat?
le(A, B) (or the infix A <= B) performs an element-wise less-than-or-equal comparison. The result is a logical scalar when the broadcasted shape contains one element, or a logical array otherwise.
How does the le function behave in MATLAB / RunMat?
- Numeric, logical, and character inputs compare element-wise using MATLAB's implicit expansion rules.
- Character arrays compare by Unicode code point; mixing them with numeric arrays behaves like comparing numeric codes (
'A' <= 65). - String scalars and string arrays compare lexically; implicit expansion works across string dimensions.
- Complex inputs are not supported, matching MATLAB's behaviour.
- Mixed numeric/string inputs raise MATLAB-compatible type errors.
le Function GPU Execution Behaviour
When both operands are gpuArray values and the active acceleration provider implements the elem_le hook, RunMat executes the comparison entirely on the device and returns a gpuArray logical result. If the provider does not expose this hook, the runtime gathers the inputs to host memory automatically and performs the CPU comparison instead of failing.
Examples of using the le function in MATLAB / RunMat
Check Whether A Scalar Value Meets A Maximum
flag = le(17, 42);
Expected output:
flag =
1
Create A Mask For Matrix Values Below Or Equal To A Threshold
M = [1 2 3; 4 5 6];
mask = le(M, 3);
Expected output:
mask =
2×3 logical array
1 1 1
0 0 0
Apply Less-Equal With Implicit Expansion
v = [1 3 5 7];
mask = le(v, [2 6]);
Expected output:
mask =
1×4 logical array
1 1 0 0
Compare Character Data To Numeric Codes With Equality Support
letters = ['A' 'B' 'C'];
isBeforeOrB = le(letters, 66);
Expected output:
isBeforeOrB =
1×3 logical array
1 1 1
Compare String Arrays Lexicographically Allowing Equality
names = ["alice" "charlie" "bob"];
earlierOrSame = le(names, "bob");
Expected output:
earlierOrSame =
1×3 logical array
1 0 1
Run le Directly On gpuArray Inputs
G1 = gpuArray([1 4 7]);
G2 = gpuArray([2 4 8]);
deviceResult = le(G1, G2);
hostResult = gather(deviceResult);
Expected output:
deviceResult =
1×3 gpuArray logical array
1 1 1
hostResult =
1×3 logical array
1 1 1
GPU residency in RunMat (Do I need gpuArray?)
You usually do not need to call gpuArray explicitly. RunMat's native auto-offload planner keeps intermediate results on the GPU when fused expressions benefit from device execution. Explicit gpuArray and gather calls remain available for compatibility with MATLAB code that manages residency manually.
FAQ
Does le return logical values?
Yes. Scalars return true or false. Arrays return logical arrays, and gpuArray inputs return gpuArray logical outputs.
How are NaN values treated?
Any comparison involving NaN returns false, matching MATLAB behaviour.
Can I compare complex numbers with le?
No. MATLAB does not define relational ordering for complex numbers, so RunMat raises a MATLAB-compatible error when complex inputs are supplied.
How are strings compared?
String scalars and arrays compare lexicographically using Unicode code points, with full support for implicit expansion against scalar strings.
Are character vectors treated as numbers or text?
Character arrays participate as numeric code points when compared to numeric inputs, and they are converted to strings when compared against string scalars or arrays.
Do I need to gather results manually after a GPU comparison?
No. When both inputs are gpuArray values and the provider supports elem_le, the result stays on the GPU. Otherwise, RunMat gathers inputs transparently and returns a host logical array.
Does implicit expansion apply to string arrays?
Yes. String arrays support MATLAB-style implicit expansion, so you can compare against scalar strings without manual replication.
Can I fuse le inside GPU expressions?
Yes. The builtin registers element-wise fusion metadata so the planner can fuse comparisons with surrounding GPU-friendly operations.
See Also
Source & Feedback
- The full source code for the implementation of the
lefunction is available at:crates/runmat-runtime/src/builtins/logical/rel/le.rs - Found a bug or behavioural difference? Please open an issue with details and a minimal repro.