View all functions

CategoryArray: Sorting Sets
GPUYes

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 of B from A, and returns the remaining elements sorted ascending by default.
  • [C, IA] = setdiff(A, B) also returns indices so that C = A(IA).
  • setdiff(A, B, 'stable') preserves the first appearance order from A instead 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