Main Content

setxor

Set exclusive OR of two arrays

Description

example

C= setxor(A,B)returns the data ofAandBthat are not in their intersection (the symmetric difference), with no repetitions. That is,setxorreturns the data that occurs inAorB, but not both.Cis in sorted order.

  • 如果AandBare tables or timetables, thensetxorreturns the rows that occur in one or the other of the two tables, but not both. For timetables,setxortakes row times into account to determine equality, and sorts the output timetableCby row times.

example

C= setxor(A,B,setOrder)returnsCin a specific order.setOrdercan be'sorted'or'stable'.

C= setxor(A,B,___,'rows')andC= setxor(A,B,'rows',___)treat each row ofAand each row ofB作为单个实体和回报the rows ofAandBthat are not in their intersection, with no repetitions. You must specifyAandBand optionally can specifysetOrder.

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] = setxor(___)also returns index vectorsiaandibusing any of the previous syntaxes.

  • Generally, the values inCare a sorted combination of the elements ofA(ia)andB(ib).

  • 如果the'rows'option is specified, thenCis a sorted combination of the rows ofA(ia,:)andB(ib,:).

  • 如果AandBare tables or timetables, thenCis a sorted combination of the rows ofA(ia,:)andB(ib,:).

example

[C,ia,ib] = setxor(A,B,'legacy')and[C,ia,ib] = setxor(A,B,'rows','legacy')preserve the behavior of thesetxorfunction from R2012b and prior releases.

The'legacy'option does not support categorical arrays, datetime arrays, duration arrays, tables, or timetables.

Examples

collapse all

Define two vectors with a value in common.

A = [5 1 3 3 3]; B = [4 1 2];

Find the values ofAandBthat are not in their intersection.

C = setxor(A,B)
C =1×42 3 4 5

Define two tables with rows in common.

A = table([1:5]',['A';'B';'C';'D';'E'],logical([0;1;0;1;0]))
A=5×3 tableVar1 Var2 Var3 ____ ____ _____ 1 A false 2 B true 3 C false 4 D true 5 E false
B = table([1:2:10]',['A';'C';'E';'G';'I'],logical(zeros(5,1)))
B=5×3 tableVar1 Var2 Var3 ____ ____ _____ 1 A false 3 C false 5 E false 7 G false 9 I false

Find the rows ofAandBthat are not in their intersection.

C = setxor(A,B)
C=4×3 tableVar1 Var2 Var3 ____ ____ _____ 2 B true 4 D true 7 G false 9 I false

Define two vectors with a value in common.

A = [5 1 3 3 3]; B = [4 1 2];

Find the values ofAandBthat are not in their intersection as well as the index vectorsiaandib.

[C,ia,ib] = setxor(A,B)
C =1×42 3 4 5
ia =2×13 1
ib =2×13 1

Cis a sorted combination of the elementsA(ia)andB(ib).

Define a table,A, of gender, age, and height for five people.

A = table(['M';'M';'F'],[27;52;31],[74;68;64],...'VariableNames',{'Gender''Age''Height'},...'RowNames',{'Ted''Fred''Betty'})
A=3×3 tableGender Age Height ______ ___ ______ Ted M 27 74 Fred M 52 68 Betty F 31 64

Define a table,B, with the same variables asA.

B = table(['F';'M'],[64;68],[31;47],...'VariableNames',{'Gender''Height''Age'},...'RowNames',{'Meg''Joe'})
B=2×3 tableGender Height Age ______ ______ ___ Meg F 64 31 Joe M 68 47

Find the rows ofAandBthat are not in their intersection, as well as the index vectorsiaandib.

[C,ia,ib] = setxor(A,B)
C=3×3 tableGender Age Height ______ ___ ______ Ted M 27 74 Joe M 47 68 Fred M 52 68
ia =2×11 2
ib = 2

Cis a sorted combination of the elementsA(ia,:)andB(ib,:).

Define two matrices with rows in common.

A = [7 8 9; 7 7 1; 7 7 1; 1 2 3; 4 5 6]; B = [1 2 3; 4 5 6; 7 7 2];

Find the rows ofAandBthat are not in their intersection as well as the index vectorsiaandib.

[C,ia,ib] = setxor(A,B,'rows')
C =3×37 7 1 7 7 2 7 8 9
ia =2×12 1
ib = 3

Cis a sorted combination of the rows ofA(ia,:)andB(ib,:).

Use thesetOrderargument to specify the ordering of the values inC.

Specify'stable'if you want the values inC有山姆e order asAandB.

A = [5 1 3 3 3]; B = [4 1 2]; [C,ia,ib] = setxor(A,B,'stable')
C =1×45 3 4 2
ia =2×11 3
ib =2×11 3

Alternatively, you can specify'sorted'order.

[C,ia,ib] = setxor(A,B,'sorted')
C =1×42 3 4 5
ia =2×13 1
ib =2×13 1

Define two vectors containingNaN.

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

Find the symmetric difference of vectorsAandB.

C = setxor(A,B)
C =1×4NaN NaN NaN NaN

Thesetxorfunction treatsNaNvalues as distinct.

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 that are not in the intersection ofAandB.

[C,ia,ib] = setxor(A,B)
C =1x4 cell{'dog'} {'dog '} {'fish'} {'fish '}
ia =2×11 3
ib =2×11 3

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

Create a column vector character array.

A = ['A';'B';'C'], class(A)
A =3x1 char array'A' 'B' 'C'
ans = 'char'

Create a row vector containing elements of numeric typedouble.

B = [66 67 68], class(B)
B =1×366 67 68
ans = 'double'

Find the symmetric difference ofAandB.

C = setxor(A,B)
C =2x1 char array'A' 'D'

The result is a column vector character array.

class(C)
ans = 'char'

Create a character vector,A.

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

Create a cell array of character vectors,B.

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

Find the character vectors that are not in the intersection ofAandB.

C = setxor(A,B)
C =4x1 cell{'fish' } {'fox' } {'horse'} {'pig' }

The result,C, is a cell array of character vectors.

class(C)
ans = 'cell'

Use the'legacy'flag to preserve the behavior ofsetxorfrom R2012b and prior releases in your code.

Find the symmetric difference ofAandBwith the current behavior.

A = [5 1 3 3 3]; B = [4 1 2 2]; [C1,ia1,ib1] = setxor(A,B)
C1 =1×42 3 4 5
ia1 =2×13 1
ib1 =2×13 1

Find the symmetric difference and preserve the legacy behavior.

[C2,ia2,ib2] = setxor(A,B,'legacy')
C2 =1×42 3 4 5
ia2 =1×25 1
ib2 =1×24 1

Input Arguments

collapse all

Input arrays. If you specify the'rows'option, thenAandBmust have the same number of columns.

AandBmust belong to the same class with the following exceptions:

  • logical,char, and all numeric classes can combine withdouble数组.

  • Cell arrays of character vectors can combine with character arrays or string arrays.

  • Categorical arrays can combine with character arrays, cell arrays of character vectors, or string arrays.

  • Datetime arrays can combine with cell arrays of date character vectors or single date character vectors.

There are additional requirements forAandBbased on data type:

  • 如果AandBare both ordinal categorical arrays, they must have the same sets of categories, including their order. If neitherAnorBare ordinal, they need not have the same sets of categories, and the comparison is performed using the category names. In this case, the categories ofCconsist of the categories ofAfollowed by the categories ofBthat are not inA. The categories are in the same order as inAandB, and the category order is used for sortingC.

  • 如果AandBare tables or timetables, they must have the same variable names (except for order). For tables, row names are ignored, so that two rows that have the same values, but different names, are considered equal. For timetables, row times are taken into account, so that two rows that have the same values, but different times, are not considered equal.

  • 如果AandBare datetime arrays, they must be consistent with each other in whether they specify a time zone.

AandBalso can be objects with the following class methods:

  • sort(orsortrowsfor the'rows'option)

  • eq

  • ne

The object class methods must be consistent with each other. These objects include heterogeneous arrays derived from the same root class. For example,AandBcan be arrays of handles to graphics objects.

Order flag, specified as'sorted'or'stable', indicates the order of the values (or rows) inC.

Flag Description
'sorted'

的值(或行)Creturn in sorted order as returned bysort.

Example

C = setxor([5 1 3],[4 1 2],'sorted')
C = 2 3 4 5

'stable'

的值(或行)Creturn in the same order as they appear inA, thenB.

Example

C = setxor([5 1 3],[4 1 2],'stable')
C = 5 3 4 2

Data Types:char|string

Output Arguments

collapse all

Symmetric difference array, returned as a vector, matrix, table, or timetable. If the inputsAandBare tables or timetables, then the order of the variables inCis the same as the order of the variables inA.

The following describes the shape ofCwhen the inputs are vectors or matrices and when the'legacy'flag is not specified:

  • 如果the'rows'flag is not specified, thenCis a column vector unless bothAandBare row vectors, in which caseCis a row vector. For example,setxor([],[1 2])returns a column vector.

  • 如果the'rows'flag is specified, thenCis a matrix containing the rows ofAandBthat are not in the intersection.

  • 如果all the values (or rows) ofAare also inB, thenCis empty.

The class of the inputsAandBdetermines the class ofC:

  • 如果the class ofAandBare the same, thenCis the same class.

  • 如果you combine achar或nondouble数字类double, thenCis the same class as the nondouble input.

  • 如果you combine alogicalclass withdouble, thenCisdouble.

  • 如果you combine a cell array of character vectors withchar, thenCis a cell array of character vectors.

  • 如果you combine a categorical array with a character vector, cell array of character vectors, or string, thenCis a categorical array.

  • 如果you combine a datetime array with a cell array of date character vectors or single date character vector, thenCis a datetime array.

  • 如果you combine a string array with a character vector or cell array of character vectors, thenCis a string array.

Index toA, returned as a column vector when the'legacy'flag is not specified.iaidentifies the values (or rows) inAthat contribute to the symmetric difference. If there is a repeated value (or row) appearing exclusively inA, theniacontains the index to the first occurrence of the value (or row).

Index toB, returned as a column vector when the'legacy'flag is not specified.ibidentifies the values (or rows) inBthat contribute to the symmetric difference. If there is a repeated value (or row) appearing exclusively inB, thenibcontains the index to the first occurrence of the value (or row).

Tips

  • To find the symmetric difference with respect to a subset of variables from a table or timetable, you can use column subscripting. For example, you can usesetxor(A(:,vars),B(:,vars)), wherevarsis a positive integer, a vector of positive integers, a variable name, a cell array of variable names, or a logical vector. Alternatively, you can usevartypeto create a subscript that selects variables of a specified type.

Extended Capabilities

Version History

Introduced before R2006a