пересечение

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

Синтаксис

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')

Описание

пример

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

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

пример

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

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

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

пример

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

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

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

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

пример

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

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

Примеры

свернуть все

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

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

Найдите значения характерными и для A и для B.

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

     4     7

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

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

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

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

     1       A      false
     3       C      false
     5       E      false

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

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

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

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

     4     7

ia = 2×1

     5
     1

ib = 2×1

     3
     1

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

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  

Составьте таблицу, B, со строками вместе с 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  

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

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

    Betty      F       31       64  

ia = 3
ib = 1

Две строки, которые имеют те же значения, но различные имена, рассматриваются равными. Поэтому мы обнаруживаем, что Бетти, A(3,:) и Мэг, B(1,:) имеет тот же пол, возраст и высоту.

Создайте две матрицы со строками вместе.

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

Найдите строки характерными и для A и для B, а также индексных векторов ia и ib, такой что C = A(ia,:) и 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 и B не должны иметь того же количества строк, но у них должно быть то же количество столбцов.

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

Задайте 'stable', если вы хотите, чтобы значения в C имели тот же порядок как в 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

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

[C,ia,ib] = intersect(A,B,'sorted')
C = 1×2

     4     7

ia = 2×1

     5
     1

ib = 2×1

     3
     1

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

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

Найдите значения характерными и для A и для B.

C = intersect(A,B)
C = 5

intersect обрабатывает значения NaN как отличные.

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

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

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

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

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

[C,ia,ib] = intersect(A,B)
C = 1x2 cell array
    {'cat'}    {'horse'}

ia = 2×1

     2
     4

ib = 2×1

     2
     4

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

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

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

ans = 
'char'

Создайте 2 3 матрица, содержащая элементы числового типа double.

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

    65    66    67
    68    69    70

ans = 
'double'

Найдите значения характерными и для A и для 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 интерпретирует B как символьный массив и возвращает символьный массив, C.

class(C)
ans = 
'char'

Создайте вектор символа, содержащий имена животных, которые имеют три буквы.

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

Создайте массив ячеек из символьных векторов, содержащий имена животных переменных длин.

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

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

C = intersect(A,B)
C = 2x1 cell array
    {'cat'}
    {'dog'}

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

class(C)
ans = 
'cell'

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

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

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

Найдите уникальные элементы A и сохраните устаревшее поведение.

[C2,ia2,ib2] = intersect(A,B,'legacy')
C2 = 1×2

     4     7

ia2 = 1×2

     5     4

ib2 = 1×2

     4     1

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

свернуть все

Входные массивы, заданные как числовые массивы, логические массивы, символьные массивы, массивы строк, категориальные массивы, массивы 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')

  • ne

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

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

Закажите флагЗначение
'sorted'Значения (или строки) в C возвращаются в отсортированном порядке. Например: C = intersect([7 0 5],[7 1 5],'sorted') возвращает C = [5 7].
'stable'Значения (или строки) в C возвращаются в том же порядке, как они появляются в A и B. Например: C = intersect([7 0 5],[7 1 5],'stable') возвращает C = [7 5].

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

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

свернуть все

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

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

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

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

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

  • Если класс A и B является тем же самым, то C является тем же классом.

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

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

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

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

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

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

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

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

Советы

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

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

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

Была ли эта тема полезной?