setdiff — Return values that appear in the first input but not the second, matching MATLAB ordering rules.
setdiff(A, B) returns the set of values (or rows) that appear in A but not in B. Results are unique, and the function can operate in sorted or stable order as well as row mode.
How does the setdiff function behave in MATLAB / RunMat?
setdiff(A, B)flattens inputs column-major, removes duplicates, subtracts the values ofBfromA, and returns the remaining elements **sorted** ascending by default.[C, IA] = setdiff(A, B)also returns indices so thatC = A(IA).setdiff(A, B, 'stable')preserves the first appearance order fromAinstead of sorting.setdiff(A, B, 'rows')treats each row as an element. Inputs must share the same number of columns.- Character arrays, string arrays, logical arrays, numeric types, and complex values are all supported.
- Legacy flags (
'legacy','R2012a') are not supported; RunMat always follows modern MATLAB semantics.
GPU behavior
setdiff is registered as a residency sink. When tensors reside on the GPU and the active provider does not yet implement a setdiff hook, RunMat gathers them to host memory, performs the CPU implementation, and materialises host-resident results. Future providers can wire a custom hook to perform the set difference directly on-device without affecting existing callers.
Examples of using setdiff in MATLAB / RunMat
Finding values exclusive to the first numeric vector
A = [5 7 5 1];
B = [7 1 3];
[C, IA] = setdiff(A, B)Expected output:
C =
5
IA =
1Preserving input order with 'stable'
A = [4 2 4 1 3];
B = [3 4 5 1];
[C, IA] = setdiff(A, B, 'stable')Expected output:
C =
2
IA =
2Working with rows of numeric matrices
A = [1 2; 3 4; 1 2];
B = [3 4; 5 6];
[C, IA] = setdiff(A, B, 'rows')Expected output:
C =
1 2
IA =
1Computing set difference for character data
A = ['m','z'; 'm','a'];
B = ['a','x'; 'm','a'];
[C, IA] = setdiff(A, B)Expected output:
C =
m
IA =
1Subtracting string arrays by row
A = ["alpha" "beta"; "gamma" "beta"];
B = ["gamma" "beta"; "delta" "beta"];
[C, IA] = setdiff(A, B, 'rows', 'stable')Expected output:
C =
1x2 string array
"alpha" "beta"
IA =
1Using setdiff with GPU arrays
G = gpuArray([10 4 6 4]);
H = gpuArray([6 4 2]);
C = setdiff(G, H)Expected output:
C =
10FAQ
What ordering does setdiff use by default?
Results are sorted ascending. Specify 'stable' to preserve the first appearance order from the first input.
How are the index outputs defined?
IA points to the positions in A that correspond to each element (or row) returned in C, using MATLAB's one-based indexing.
Can I combine 'rows' with 'stable'?
Yes. 'rows' can be paired with either 'sorted' (default) or 'stable'. Other option combinations that conflict (e.g. 'sorted' with 'stable') are rejected.
Does setdiff remove NaN values from A when they exist in B?
Yes. NaN values are considered equal. If B contains NaN, all NaN entries from A are removed.
Are complex numbers supported?
Absolutely. Complex values use MATLAB's ordering rules (magnitude, then real part, then imaginary part) for the sorted output.
Does GPU execution change the results?
No. Until providers supply a device implementation, RunMat gathers GPU inputs and executes the CPU path to guarantee MATLAB-compatible behaviour.
What happens if the inputs have different classes?
RunMat follows MATLAB's rules: both inputs must share the same class (numeric/logical, complex, char, or string). Mixed-class inputs raise descriptive errors.
Can I request 'legacy' behaviour?
No. RunMat implements the modern semantics only. Passing 'legacy' or 'R2012a' results in an error.
See also
unique, union, intersect, ismember, gpuArray, gather
Source & Feedback
- Source code: crates/runmat-runtime/src/builtins/array/sorting_sets/setdiff.rs
- Found a bug? Open an issue with a minimal reproduction.