Set intersection of two arrays

collapse all in page

## Syntax

`C = intersect(A,B)`

`C = intersect(A,B,setOrder)`

`C = intersect(A,B,___,'rows')`

`C = intersect(A,B,'rows',___)`

`[C,ia,ib]= intersect(___)`

`[C,ia,ib]= intersect(A,B,'legacy')`

`[C,ia,ib]= intersect(A,B,'rows','legacy')`

## Description

example

`C = intersect(A,B)`

returns the data common to both `A`

and `B`

, with no repetitions. `C`

is in sorted order.

If

`A`

and`B`

are tables or timetables, then`intersect`

returns the set of rows common to both tables. For timetables,`intersect`

takes row times into account to determine equality, and sorts the output timetable`C`

by row times.

example

`C = intersect(A,B,setOrder)`

returns `C`

in a specific order. `setOrder`

can be `'sorted'`

or `'stable'`

.

`C = intersect(A,B,___,'rows')`

and

treat each row of `C`

= intersect(`A,B`

,'rows',___)`A`

and each row of `B`

as single entities and return the rows common to both `A`

and `B`

, with no repetitions. You must specify `A`

and `B`

and optionally can specify `setOrder`

.

The `'rows'`

option does not support cell arrays, unless one of the inputs is either a categorical array or a datetime array.

example

`[C,ia,ib]= intersect(___)`

also returns index vectors `ia`

and `ib`

using any of the previous syntaxes.

Generally,

`C = A(ia)`

and`C = B(ib)`

.If the

`'rows'`

option is specified, then`C = A(ia,:)`

and`C = B(ib,:)`

.If

`A`

and`B`

are tables or timetables, then`C = A(ia,:)`

and`C = B(ib,:)`

.

example

`[C,ia,ib]= intersect(A,B,'legacy')`

and `[`

preserve the behavior of the `C`

,`ia`

,`ib`

]= intersect(`A,B`

,'rows','legacy')`intersect`

function from R2012b and prior releases.

The `'legacy'`

option does not support categoricalarrays, datetime arrays, duration arrays, tables, or timetables.

## Examples

collapse all

### Intersection of Two Vectors

Open Live Script

Create two vectors that have some values in common.

A = [7 1 7 7 4]; B = [7 0 4 4 0];

Find the values common to both `A`

and `B`

.

C = intersect(A,B)

`C = `*1×2* 4 7

### Intersection of Two Tables

Open Live Script

Create two tables with rows in common.

A = table([1:5]',categorical({'A';'B';'C';'D';'E'}),logical([0;1;0;1;0]))

`A=`*5×3 table* Var1 Var2 Var3 ____ ____ _____ 1 A false 2 B true 3 C false 4 D true 5 E false

B = table([1:2:10]',categorical({'A';'C';'E';'G';'I'}),logical(zeros(5,1)))

`B=`*5×3 table* Var1 Var2 Var3 ____ ____ _____ 1 A false 3 C false 5 E false 7 G false 9 I false

Find the rows common to both `A`

and `B`

.

C = intersect(A,B)

`C=`*3×3 table* Var1 Var2 Var3 ____ ____ _____ 1 A false 3 C false 5 E false

### Intersection of Two Vectors and Their Indices

Open Live Script

Create two vectors with values in common.

A = [7 1 7 7 4]; B = [7 0 4 4 0];

Find the values common to both `A`

and `B`

, as well as the index vectors `ia`

and `ib`

, such that `C = A(ia)`

and `C = B(ib)`

.

[C,ia,ib] = intersect(A,B)

`C = `*1×2* 4 7

`ia = `*2×1* 5 1

`ib = `*2×1* 3 1

### Intersection of Two Tables and Their Indices

Open Live Script

Create a table, `A`

, of gender, age, and height for five people.

A = table(categorical({'M';'M';'F';'M';'F'}),...[27;52;31;46;35],[74;68;64;61;64],...'VariableNames',{'Gender' 'Age' 'Height'},...'RowNames',{'Ted' 'Fred' 'Betty' 'Bob' 'Judy'})

`A=`*5×3 table* Gender Age Height ______ ___ ______ Ted M 27 74 Fred M 52 68 Betty F 31 64 Bob M 46 61 Judy F 35 64

Create a table, `B`

, with rows in common with `A`

.

B = table(categorical({'F';'M';'F';'F'}),...[31;47;35;23],[64;68;62;58],...'VariableNames',{'Gender' 'Age' 'Height'},...'RowNames',{'Meg' 'Joe' 'Beth' 'Amy'})

`B=`*4×3 table* Gender Age Height ______ ___ ______ Meg F 31 64 Joe M 47 68 Beth F 35 62 Amy F 23 58

Find the rows common to both `A`

and `B`

, as well as the index vectors `ia`

and `ib`

, such that `C = A(ia,:)`

and `C = B(ib,:)`

.

[C,ia,ib] = intersect(A,B)

`C=`*1×3 table* Gender Age Height ______ ___ ______ Betty F 31 64

ia = 3

ib = 1

Two rows that have the same values, but different names, are considered equal. Therefore, we discover that Betty, `A(3,:)`

, and Meg, `B(1,:)`

have the same gender, age, and height.

### Intersection of Rows in Two Matrices

Open Live Script

Create two matrices with rows in common.

A = [2 2 2; 0 0 1; 1 2 3; 1 1 1];B = [1 2 3; 2 2 2; 2 2 0];

Find the rows common to both `A`

and `B`

as well as the index vectors `ia`

and `ib`

, such that `C = A(ia,:)`

and `C = B(ib,:)`

.

`[C,ia,ib] = intersect(A,B,'rows')`

`C = `*2×3* 1 2 3 2 2 2

`ia = `*2×1* 3 1

`ib = `*2×1* 1 2

`A`

and `B`

do not need to have the same number of rows, but they must have the same number of columns.

### Intersection with Specified Output Order

Open Live Script

Use the `setOrder`

argument to specify the ordering of the values in `C`

.

Specify `'stable'`

if you want the values in `C`

to have the same order as in `A`

.

`A = [7 1 7 7 4]; B = [7 0 4 4 0];[C,ia,ib] = intersect(A,B,'stable')`

`C = `*1×2* 7 4

`ia = `*2×1* 1 5

`ib = `*2×1* 1 3

Alternatively, you can specify `'sorted'`

order.

`[C,ia,ib] = intersect(A,B,'sorted')`

`C = `*1×2* 4 7

`ia = `*2×1* 5 1

`ib = `*2×1* 3 1

### Intersection of Vectors Containing NaNs

Open Live Script

Create two vectors containing `NaN`

.

A = [5 NaN NaN]; B = [5 NaN NaN];

Find the values common to both `A`

and `B`

.

C = intersect(A,B)

C = 5

`intersect`

treats `NaN`

values as distinct.

### Cell Array of Character Vectors with Trailing White Space

Open Live Script

Create a cell array of character vectors, `A`

.

A = {'dog','cat','fish','horse'};

Create a cell array of character vectors, `B`

, where some of the vectors have trailing white space.

B = {'dog ','cat','fish ','horse'};

Find the character vectors common to both `A`

and `B`

.

[C,ia,ib] = intersect(A,B)

`C = `*1x2 cell* {'cat'} {'horse'}

`ia = `*2×1* 2 4

`ib = `*2×1* 2 4

`intersect`

treats trailing white space in cell arrays of character vectors as distinct characters.

### Intersection of Arrays of Different Classes and Shapes

Open Live Script

Create a column vector character array.

A = ['A';'B';'C'], class(A)

`A = `*3x1 char array* 'A' 'B' 'C'

ans = 'char'

Create a 2-by-3 matrix containing elements of numeric type `double`

.

B = [65 66 67;68 69 70], class(B)

`B = `*2×3* 65 66 67 68 69 70

ans = 'double'

Find the values common to both `A`

and `B`

.

[C,ia,ib] = intersect(A,B)

`C = `*3x1 char array* 'A' 'B' 'C'

`ia = `*3×1* 1 2 3

`ib = `*3×1* 1 3 5

`intersect`

interprets `B`

as a character array and returns a character array, `C`

.

class(C)

ans = 'char'

### Intersection of Char and Cell Array of Character Vectors

Open Live Script

Create a character vector containing animal names that have three letters.

A = ['dog';'cat';'fox';'pig'];class(A)

ans = 'char'

Create a cell array of character vectors containing animal names of varying lengths.

B = {'cat','dog','fish','horse'};class(B)

ans = 'cell'

Find the character vectors common to both `A`

and `B`

.

C = intersect(A,B)

`C = `*2x1 cell* {'cat'} {'dog'}

The result, `C`

, is a cell array of character vectors.

class(C)

ans = 'cell'

### Preserve Legacy Behavior of intersect

Open Live Script

Use the `'legacy'`

flag to preserve the behavior of `intersect`

from R2012b and prior releases in your code.

Find the intersection of `A`

and `B`

with the current behavior.

A = [7 1 7 7 4]; B = [7 0 4 4 0];[C1,ia1,ib1] = intersect(A,B)

`C1 = `*1×2* 4 7

`ia1 = `*2×1* 5 1

`ib1 = `*2×1* 3 1

Find the unique elements of `A`

and preserve the legacy behavior.

`[C2,ia2,ib2] = intersect(A,B,'legacy')`

`C2 = `*1×2* 4 7

`ia2 = `*1×2* 5 4

`ib2 = `*1×2* 4 1

## Input Arguments

collapse all

`setOrder`

— Order flag

`'sorted'`

(default) | `'stable'`

Order flag, specified as `'sorted'`

or `'stable'`

, indicates the order of the values (or rows) in `C`

.

Flag | Description |
---|---|

`'sorted'` | The values (or rows) in
`C = intersect([7 0 1 5],[0 2 7 5],'sorted')` C = 0 5 7 |

`'stable'` | The values (or rows) in
`C = intersect([7 0 1 5],[0 2 7 5],'stable')` C = 7 0 5 |

**Data Types: **`char`

| `string`

## Output Arguments

collapse all

`C`

— Data common to `A`

and `B`

vector | matrix | table | timetable

Data common to `A`

and `B`

, returned as a vector, matrix, or table. If the inputs `A`

and `B`

are tables or timetables, then the order of the variables in `C`

is the same as the order of the variables in `A`

.

The following describes the shape of `C`

when the inputs are vectors or matrices and when the `'legacy'`

flag is not specified:

If the

`'rows'`

flag is not specified, then`C`

is a column vector unless both`A`

and`B`

are row vectors, in which case`C`

is a row vector.If the

`'rows'`

flag is specified, then`C`

is a matrix containing the rows in common from`A`

and`B`

.

The class of the inputs `A`

and `B`

determinesthe class of `C`

:

If the class of

`A`

and`B`

arethe same, then`C`

is the same class.If you combine a

`char`

or nondoublenumeric class with`double`

, then`C`

isthe same class as the nondouble input.If you combine a

`logical`

classwith`double`

, then`C`

is`double`

.If you combine a cell array of character vectors with

`char`

,then`C`

is a cell array of character vectors.If you combine a categorical array with a charactervector, cell array of character vectors, or string, then

`C`

isa categorical array.If you combine a datetime array with a cell arrayof date character vectors or single date character vector, then

`C`

isa datetime array.If you combine a string array with a character vectoror cell array of character vectors, then

`C`

is astring array.

`ia`

— Index to `A`

column vector

Index to `A`

, returned as a column vector when the `'legacy'`

flag is not specified. `ia`

identifies the values (or rows) in `A`

that are common to `B`

. If there is a repeated value (or row) in `A`

, then `ia`

contains the index to the first occurrence of the value (or row).

`ib`

— Index to `B`

column vector

Index to `B`

, returned as a column vector when the `'legacy'`

flag is not specified. `ib`

identifies the values (or rows) in `B`

that are common to `A`

. If there is a repeated value (or row) in `B`

, then `ib`

contains the index to the first occurrence of the value (or row).

## Tips

To find the intersection with respect to a subset of variables from a table or timetable, you can use column subscripting. For example, you can use

`intersect(A(:,`

, where),B(:,`vars`

))`vars`

is a positive integer, a vector of positive integers, a variable name, a cell array of variable names, or a logical vector. Alternatively, you can use vartype to create a subscript that selects variables of a specified type.`vars`

## Extended Capabilities

### Tall Arrays

Calculate with arrays that have more rows than fit in memory.

Usage notes and limitations:

The

`'legacy'`

flag is not supported.The

`'stable'`

flag is not supported when both inputs are tall arrays.Inputs of type

`'char'`

are not supported when both inputs are tall arrays.Ordinal categorical arrays are not supported.

For more information, see Tall Arrays.

### C/C++ Code Generation

Generate C and C++ code using MATLAB® Coder™.

Usage notes and limitations:

Code generation does not support cell arrays for the first or second arguments.

When you do not specify the

`'rows'`

option:Inputs

`A`

and`B`

must be vectors. If you specify the`'legacy'`

option, inputs`A`

and`B`

must be row vectors.The first dimension of a variable-size row vector must have fixed length 1. The second dimension of a variable-size column vector must have fixed length 1.

The input

`[]`

is not supported. Use a 1-by-0 or 0-by-1 input, for example,`zeros(1,0)`

, to represent the empty set.If you specify the

`'legacy'`

option, then empty outputs are row vectors, 1-by-0. They are never 0-by-0.

When you specify both the

`'legacy'`

option and the`'rows'`

option, the outputs`ia`

and`ib`

are column vectors. If these outputs are empty, they are 0-by-1. They are never 0-by-0, even if the output`C`

is 0-by-0.When the

`setOrder`

is`'sorted'`

or when you specify the`'legacy'`

option, the inputs must already be sorted in ascending order. The first output,`C`

, is sorted in ascending order.Complex inputs must be

`single`

or`double`

.When one input is complex and the other input is real, do one of the following:

Set

`setOrder`

to`'stable'`

.Sort the real input in complex ascending order (by absolute value). Suppose the real input is

`x`

. Use`sort(complex(x))`

or`sortrows(complex(x))`

.

See Code Generation for Complex Data with Zero-Valued Imaginary Parts (MATLAB Coder).

### Thread-Based Environment

Run code in the background using MATLAB® `backgroundPool`

or accelerate code with Parallel Computing Toolbox™ `ThreadPool`

.

### GPU Arrays

Accelerate code by running on a graphics processing unit (GPU) using Parallel Computing Toolbox™.

Usage notes and limitations:

The

`'legacy'`

flag is not supported.64-bit integers are not supported.

For more information, see Run MATLAB Functions on a GPU (Parallel Computing Toolbox).

### Distributed Arrays

Partition large arrays across the combined memory of your cluster using Parallel Computing Toolbox™.

Usage notes and limitations:

The

`'legacy'`

flag is not supported.Table, timetable, categorical, datetime and duration inputs are not supported.

Inputs of type

`char`

and`string`

are not supported when`A`

or`B`

is a cell array of character vectors. Convert cell arrays of character vectors input arguments to string arrays instead.

For more information, see Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox).

## Version History

**Introduced before R2006a**

## See Also

unique | union | ismember | issorted | setdiff | setxor | sort

### Topics

- Combine Categorical Arrays

## MATLAB Command

You clicked a link that corresponds to this MATLAB command:

Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.

Select a Web Site

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

You can also select a web site from the following list:

### Americas

- América Latina (Español)
- Canada (English)
- United States (English)

### Europe

- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)

- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- Deutsch
- English
- Français

- United Kingdom (English)

Contact your local office