setdiff

Установите различие двух массивов

Описание

пример

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

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

пример

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

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

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

пример

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

  • Обычно C = A(ia).

  • Если на 'rows' задается опция, затем C = A(ia,:).

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

пример

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

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

Примеры

свернуть все

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

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

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

C = setdiff(A,B)
C = 1×3

     1     3     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 = setdiff(A,B)
C=2×3 table
    Var1    Var2    Var3 
    ____    ____    _____

     2       B      true 
     4       D      true 

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

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

Найдите значения в A которые не в B а также вектор индекса ia, таким образом C = A(ia).

[C,ia] = setdiff(A,B)
C = 1×3

     1     3     5

ia = 3×1

     4
     1
     5

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

A = table(['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  

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

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

    Meg       F         64      31 
    Joe       M         68      47 
    Beth      F         62      35 
    Amy       F         58      23 

Найдите строки в A которые не в B, а также вектор индекса ia, таким образом C = A(ia,:).

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

    Judy      F       35       64  
    Ted       M       27       74  
    Bob       M       46       61  
    Fred      M       52       68  

ia = 4×1

     5
     1
     4
     2

Строки C находятся в отсортированном порядке сначала по Gender и далее по Age.

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

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

Найдите строки из A которые не в B а также вектор индекса ia, таким образом C = A(ia,:).

[C,ia] = setdiff(A,B,'rows')
C = 2×3

     1     4     5
     7     9     7

ia = 2×1

     5
     1

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

Задайте 'stable' или 'sorted' когда порядок значений в C важны.

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

     3     1     5

ia = 3×1

     1
     4
     5

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

 [C,ia] = setdiff(A,B,'sorted')
C = 1×3

     1     3     5

ia = 3×1

     4
     1
     5

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

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

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

C = setdiff(A,B)
C = 1×2

   NaN   NaN

setdiff лечит NaN значений как отдельных.

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

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

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

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

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

[C,ia] = setdiff(A,B)
C = 1x2 cell
    {'dog'}    {'fish'}

ia = 2×1

     1
     3

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

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

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

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

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

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

C = setdiff(A,B)
C = 2x1 cell
    {'fox'}
    {'pig'}

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

class(C)
ans = 
'cell'

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

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

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

     1     3     5

ia1 = 3×1

     4
     1
     5

Найдите различие A и B, и сохранить унаследованное поведение.

[C2,ia2] = setdiff(A,B,'legacy')
C2 = 1×3

     1     3     5

ia2 = 1×3

     7     1     5

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

свернуть все

Входные массивы, заданные как числовые массивы, логические массивы, символьные массивы, строковые массивы, категориальные массивы, массивы 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 = setdiff([4 1 3 2 5],[2 1],'sorted')
C =

     3     4     5

'stable'

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

Пример

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

     4     3     5

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

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

свернуть все

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

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

  • Если на 'rows' флаг не задан и A является вектор-строка, тогда C является вектор-строка.

  • Если на 'rows' флаг не задан и A не является вектор-строка, тогда C является вектор-столбец.

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

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

Класс C совпадает с классом A, если только:

  • A является символьный массив и B - массив ячеек из векторов символов, в этом случае C - массив ячеек из векторов символов.

  • A - вектор символов, массив ячеек векторов символов, или строка, и B является категориальным массивом, в этом случае C является категориальным массивом.

  • A - массив ячеек из векторов символов или одинарных векторов символов и B является массивом datetime, в этом случае C является массивом datetime.

  • A - вектор символов или массив ячеек из векторов символов и B - строковые массивы, в этом случае C являются строковые массивы.

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

Совет

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

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

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