setdiff

Разность множеств двух массивов

Синтаксис

C = setdiff(A,B)
C = setdiff(A,B,setOrder)
C = setdiff(A,B,___,'rows')
C = setdiff(A,B,'rows',___)
[C,ia] = setdiff(___)
[C,ia] = setdiff(A,B,'legacy')
[C,ia] = setdiff(A,B,'rows','legacy')

Описание

пример

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.

Опция '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 и предшествующих релизов.

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

Примеры

свернуть все

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

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 array
    {'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 array
    {'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, массивы длительности, массивы ячеек из символьных векторов, таблицы или расписания. Если вы задаете опцию '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 возвращаются в отсортированном порядке. Например: C = setdiff([4 1 3 2],[2 1],'sorted') возвращает C = [3 4].
'stable'Значения (или строки) в C возвращаются в том же порядке как в A. Например: C = setdiff([4 1 3 2],[2 1],'stable') возвращает C = [4 3].

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

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

свернуть все

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

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

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

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

  • Если флаг the'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 содержит индекс к первому вхождению значения (или строка).

Советы

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

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

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