setxor

Установите исключающее ИЛИ из двух массивов

Описание

пример

C = setxor(A,B) возвращает данные A и B которые не находятся в их пересечении (симметричное различие), без повторений. То есть, setxor возвращает данные, которые происходят в A или B, но не то и другое. C находится в сортированном порядке.

  • Если A и B являются таблицами или расписаниями, тогда setxor возвращает строки, которые находятся в одной или другой из двух таблиц, но не в обеих. Для расписаний, setxor учитывает время строк, чтобы определить равенство, и сортирует выходное расписание C по строкам.

пример

C = setxor(A,B,setOrder) возвращает C в определенном порядке. setOrder можно 'sorted' или 'stable'.

C = setxor(A,B,___,'rows') и C = setxor(A,B,'rows',___) обработайте каждую строку A и каждую строку B как единичные сущности и возвращает строки A и B которые не находятся на их пересечении, без повторений. Вы должны задать A и B и опционально может задать setOrder.

The 'rows' опция не поддерживает массивы ячеек, если один из входов не является либо категориальным массивом, либо массивом datetime.

пример

[C,ia,ib] = setxor(___) также возвращает векторы индекса ia и ib использование любого из предыдущих синтаксисов.

  • Как правило, значения в C являются отсортированной комбинацией элементов A(ia) и B(ib).

  • Если на 'rows' задается опция, затем C - отсортированная комбинация строк A(ia,:) и B(ib,:).

  • Если A и B являются таблицами или расписаниями, затем C - отсортированная комбинация строк A(ia,:) и B(ib,:).

пример

[C,ia,ib] = setxor(A,B,'legacy') и [C,ia,ib] = setxor(A,B,'rows','legacy') сохранить поведение setxor функция от R2012b и предыдущих релизов.

The 'legacy' опция не поддерживает категориальные массивы, массивы datetime, массивы длительности, таблицы или timetables.

Примеры

свернуть все

Задайте два вектора с общим значением.

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

Найдите значения A и B которые не находятся в их пересечении.

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

     2     3     4     5

Задайте две таблицы с общими строками.

A = table([1:5]',['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]',['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

Найти строки A и B которые не находятся в их пересечении.

C = setxor(A,B)
C=4×3 table
    Var1    Var2    Var3 
    ____    ____    _____

     2       B      true 
     4       D      true 
     7       G      false
     9       I      false

Задайте два вектора с общим значением.

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

Найдите значения A и B которые находятся не в их пересечении, а также векторы индекса ia и ib.

[C,ia,ib] = setxor(A,B)
C = 1×4

     2     3     4     5

ia = 2×1

     3
     1

ib = 2×1

     3
     1

C - сортированная комбинация элементов A(ia) и B(ib).

Задайте таблицу, A, пола, возраста и роста для пяти человек.

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

    Ted        M       27       74  
    Fred       M       52       68  
    Betty      F       31       64  

Задайте таблицу, B, с теми же переменными, что и A.

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

    Meg      F         64      31 
    Joe      M         68      47 

Найти строки A и B которые не находятся в их пересечении, а также векторы индекса ia и ib.

[C,ia,ib] = setxor(A,B)
C=3×3 table
            Gender    Age    Height
            ______    ___    ______

    Ted       M       27       74  
    Joe       M       47       68  
    Fred      M       52       68  

ia = 2×1

     1
     2

ib = 2

C - сортированная комбинация элементов A(ia,:) и B(ib,:).

Задайте две матрицы с общими строками.

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];

Найти строки A и B которые находятся не в их пересечении, а также векторы индекса ia и ib.

[C,ia,ib] = setxor(A,B,'rows')
C = 3×3

     7     7     1
     7     7     2
     7     8     9

ia = 2×1

     2
     1

ib = 3

C - отсортированная комбинация строк A(ia,:) и B(ib,:).

Используйте setOrder аргумент для задания упорядоченного расположения значений в C.

Задайте 'stable' если вам нужны значения в C иметь тот же порядок, что и A и B.

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

     5     3     4     2

ia = 2×1

     1
     3

ib = 2×1

     1
     3

Также можно задать 'sorted' порядок.

[C,ia,ib] = setxor(A,B,'sorted')
C = 1×4

     2     3     4     5

ia = 2×1

     3
     1

ib = 2×1

     3
     1

Задайте два вектора, содержащие NaN.

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

Найдите симметричное различие векторов A и B.

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

   NaN   NaN   NaN   NaN

The setxor функция обрабатывает NaN значений как отдельных.

Создайте массив ячеек из векторов символов, A.

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

Создайте массив ячеек из векторов символов, B, где некоторые векторы имеют конечный пробел.

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

Найдите векторы символов, которые не находятся в пересечении A и B.

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

ia = 2×1

     1
     3

ib = 2×1

     1
     3

setxor рассматривает конечный пробел в массивах ячеек векторов символов как отдельные символы.

Создайте вектор-столбец символьный массив.

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

ans = 
'char'

Создайте вектор-строку, содержащую элементы числового типа double.

B = [66 67 68], class(B)
B = 1×3

    66    67    68

ans = 
'double'

Найдите симметричное различие A и B.

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

Результатом является вектор-столбец символьного массива.

class(C)
ans = 
'char'

Создайте вектор символов, A.

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

Создайте массив ячеек из векторов символов, B.

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

Найдите векторы символов, которые не находятся в пересечении A и B.

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

Результат, C, - массив ячеек из векторов символов.

class(C)
ans = 
'cell'

Используйте 'legacy' флаг для сохранения поведения setxor из R2012b и предыдущих релизов в вашем коде.

Найдите симметричное различие A и B с текущим поведением.

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

     2     3     4     5

ia1 = 2×1

     3
     1

ib1 = 2×1

     3
     1

Найдите симметричное различие и сохраните унаследованное поведение.

[C2,ia2,ib2] = setxor(A,B,'legacy')
C2 = 1×4

     2     3     4     5

ia2 = 1×2

     5     1

ib2 = 1×2

     4     1

Входные параметры

свернуть все

Входные массивы, заданные как числовые массивы, логические массивы, символьные массивы, строковые массивы, категориальные массивы, массивы datetime, массивы длительности, массивы ячеек из векторов символов, таблицы или timetables. Если вы задаете 'rows' опция, A и B должно иметь одинаковое число столбцов.

A и B должен принадлежать к тому же классу за следующими исключениями:

  • logical, char, и все числовые классы могут объединяться с double массивы.

  • Массивы ячеек из символьных векторов можете комбинировать с символьными массивами или строковые массивы.

  • Категориальные массивы могут сочетаться с символьными массивами, массивами ячеек векторов символов или строковых массивов.

  • Массивы Datetime могут комбинироваться с массивами ячеек дат или отдельными векторами символов дат векторов символов.

Существуют дополнительные требования к A и B на основе типа данных:

  • Если A и B оба являются порядковыми категориальными массивами, они должны иметь одинаковые наборы категорий, включая их порядок. Если ни один из них Aни B являются порядковыми, они не должны иметь одинаковых наборов категорий, и сравнение выполняется с использованием имен категорий. В этом случае категории C отсортированное объединение категорий из A и B.

  • Если A и B являются таблицами или расписаниями, они должны иметь одинаковые имена переменных (кроме порядка). Для таблиц имена строк игнорируются, так что две строки с одинаковыми значениями, но различными именами считаются равными. Для расписаний учитываются значения времени строк, так что две строки, которые имеют одинаковые значения, но разное время, не считаются равными.

  • Если A и B являются массивами datetime, они должны быть согласованы друг с другом в том, задают ли они часовой пояс.

A и B также могут быть объектами со следующими методами классов:

  • sort (или sortrows для 'rows' опция)

  • eq

  • ne

Методы класса объекта должны быть согласованы друг с другом. Эти объекты включают разнородные массивы, выведенные из того же корневого класса. Для примера, A и B могут быть массивами указателей на графические объекты.

Флаг порядка, заданный как 'sorted' или 'stable', указывает порядок значений (или строк) в C.

ФлагОписание
'sorted'

Значения (или строки) в C возврат в отсортированном порядке по возвращению sort.

Пример

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

     2     3     4     5

'stable'

Значения (или строки) в C возвращаются в том же порядке, в котором они появляются в A, затем B.

Пример

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

     5     3     4     2

Типы данных: char | string

Выходные аргументы

свернуть все

Симметричный разностный массив, возвращенный в виде вектора, матрицы, таблицы или timetable. Если вводится A и B являются таблицами или расписаниями, затем порядком переменных в C совпадает с порядком переменных в A.

Ниже описывается форма C когда входами являются векторы или матрицы и когда 'legacy' флаг не задан:

  • Если на 'rows' флаг не задан, тогда C является вектор-столбец, если только оба не A и B Векторы-строки, в каком случае C является вектор-строка. Для примера, setxor([],[1 2]) возвращает вектор-столбец.

  • Если на 'rows' задается флаг, затем C - матрица, содержащая строки A и B которые не находятся на пересечении.

  • Если все значения (или строки) A также находятся в B, затем C пуст.

Класс входов A и B определяет класс C:

  • Если класс A и B то же самое C - тот же класс.

  • Если вы комбинируете char или недоусмысленный числовой класс с double, затем C - тот же класс, что и входной вход nondouble.

  • Если вы комбинируете logical класс с double, затем C является double.

  • Если вы комбинируете массив ячеек из векторов символов с char, затем C - массив ячеек из векторов символов.

  • Если вы комбинируете категориальный массив с вектором символов, массивом ячеек из векторов символов или строкой, то C является категориальным массивом.

  • Если вы комбинируете массив datetime с массивом ячеек из векторов символов даты или с одним вектором символов даты, то C является массивом datetime.

  • Если вы комбинируете строковые массивы с вектором символов или массивом ячеек векторов символов, то C являются строковые массивы.

Индексируйте к A, возвращается как вектор-столбец, когда 'legacy' флаг не задан. ia определяет значения (или строки) в A которые вносят вклад в симметричное различие. Если существует повторное значение (или строка), появляющееся исключительно в A, затем ia содержит индекс первого вхождения значения (или строки).

Индексируйте к B, возвращается как вектор-столбец, когда 'legacy' флаг не задан. ib определяет значения (или строки) в B которые вносят вклад в симметричное различие. Если существует повторное значение (или строка), появляющееся исключительно в B, затем ib содержит индекс первого вхождения значения (или строки).

Совет

  • Чтобы найти симметричное различие относительно подмножества переменных из таблицы или timetable, можно использовать индексирование столбцов. Например, можно использовать setxor (A (:, vars), B (:, vars)), где vars - положительное целое число, вектор положительных целых чисел, имя переменной, массив ячеек с именами переменных или логический вектор. Также можно использовать vartype для создания индекса, выбирающего переменные заданного типа.

Расширенные возможности

.
Представлено до R2006a