What does the setdiff function do in MATLAB / RunMat?
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.
setdiff Function GPU Execution Behaviour
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 the setdiff function 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 =
1
Preserving 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 =
2
Working 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 =
1
Computing 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 =
1
Subtracting 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 =
1
Using setdiff with GPU arrays
G = gpuArray([10 4 6 4]);
H = gpuArray([6 4 2]);
C = setdiff(G, H);
RunMat gathers G and H to the host (until providers implement a GPU hook) and returns:
C =
10
FAQ
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
- Implementation:
crates/runmat-runtime/src/builtins/array/sorting_sets/setdiff.rs - Issues / feedback: https://github.com/runmat-org/runmat/issues/new/choose