setdiff возвращает элементы или строк или столбцов массива, которые не принадлежат другому массиву

## Синтаксис

                v = setdiff(a, b)
                v = setdiff(a, b, orien)
                [v, ka] = setdiff(..)

## Аргументы

a, b

  векторы, матрицы или гиперматрицы действительных или комплексных чисел, или закодированные целые числа, или строки. Оба должны иметь одинаковые типы данных (или типы целых чисел).

  Если используется опция `orien="r"`, то `a` и `b` должны иметь одинаковое количество столбцов. Если используется `orien="c"`, то они должны иметь одинаковое количество строк.

orien
  направленная обработка:
  - `"r"`: строки из `a` ищутся среди строк в `b`.
  - `"c"`: столбцы из `a` ищутся среди столбцов в `b`.
  - `orien` не указано: элементы из `a` ищутся среди элементов `b`.
v
  - сортированный вектор из компонентов `a`, которые отсутствуют в `b`.
  - `orien="r"`: матрица строк из `a`, которые отсутствуют в `b`, отсортированный в лексикографическом порядке.
  - `orien="c"`: матрица столбцов из `a`, которые отсутствуют в `b`, отсортированный в лексикографическом порядке.
ka

  вектор линейный индексов выбранных элементов, строк, столбцов из `a` таких, что

  - `v = a(ka)` либо
  - `v = a(ka,:)` (`orien="r"`) либо
  - `v = a(:,ka)` (`orien="c"`)

## Описание

`setdiff(a, b,..)` вычисляет и возвращает элементы либо строк либо столбцов из `a` которые ОТСУТСТВУЮТ в `b`.

Все дупликаты (элементы или строк или столбцов) удаляются из `a` и из `b` перед обработкой.

Если `a` - гиперматрица и используется опция `"r"`, то перед обработкой `a` заменяется матрицей, состоящией из строк по всем своим более высоким размерностям. То же самое и в случае, если `b` является гиперматрицей. Если исползуется опция `"c"`, то `a` или/и `"b"` заменяются соответствующими матрицами, состоящими из всех своих столбцов.

Формат результатов представлен в следующей таблице, в соответствии с формой `a` и опцией `orien`. Во всех случаях, если все элементы `a` находятся в `b`, возвращается `[]` для `v` как для `ka`:

orien → | отсутствует | "r" | "c"
a ↓ | v | ka | v | ka | v | ka
--- | --- | --- | --- | --- | --- | ---
строка | cтр | cтр | cтр | скал | cтр | cтр
столбец | cтлб | cтлб | cтлб | cтлб | cтлб | скал
матрица | cтлб | cтлб | матр | cтлб | матр | cтр
гиперматрица | cтлб | cтлб | матр | cтлб | матр | cтр
скаляр | скал | скал | скал | скал | скал | скал

`v` и `ka` становятся пустыми `[]`, если `a` пуста (либо `b`), или все элементы `a` находятся в `b`.

## Примеры

Пример №1:

    a = grand(1, 10,"uin", 0, 9)
    b = grand(2, 4, "uin", 0, 9)
    [d, k] = setdiff(a, b);
    d, k

    --> a = grand(1, 10,"uin", 0, 9)
     a  =
       2.   2.   4.   5.   4.   1.   9.   5.   8.   3.
    --> b = grand(2, 4, "uin", 0, 9)
     b  =
       5.   0.   9.   9.
       5.   6.   0.   4.
    --> [d, k] = setdiff(a, b);
    --> d, k
     d  =
       1.   2.   3.   8.
     k  =
       6.   1.   10.   9.

Пример №2: постолбцовая обработка

    a = grand(2, 7,"uin", 0, 3)
    b = grand(2, 10, "uin", 0, 3)
    [d, k] = setdiff(a, b, "c");
    d, k

    --> a = grand(2, 7,"uin", 0, 3)
     a  =
       0.   1.   0.   2.   3.   0.   2.
       2.   2.   2.   1.   0.   1.   2.
    --> b = grand(2, 10, "uin", 0, 3)
     b  =
       1.   1.   3.   1.   1.   1.   3.   0.   2.   0.
       3.   3.   2.   2.   0.   0.   1.   0.   1.   0.
    --> [d, k] = setdiff(a, b, "c");
    --> d, k
     d  =
       0.   0.   2.   3.
       1.   2.   2.   0.
     k  =
       6.   1.   7.   5.

Пример №3: с текстом

    v1 = tokens("ab  ca  ba  bb  ca  cb  ba  aa  cc  bc  ac  aa")'
    v2 = tokens("cc  ac  ca  bb  ac  bc  ab")'
    [r, k] = setdiff(v1, v2);
    r, k

    --> v1 = tokens("ab  ca  ba  bb  ca  cb  ba  aa  cc  bc  ac  aa")'
     v1  =
    !ab  ca  ac  bb  ca  cb  ba  aa  cc  bc  ac  aa  !
    --> v2 = tokens("cc  ac  ca  bb  ac  bc  ab")'
     v2  =
    !cc  ac  ca  bb  ac  bc  ab  !
    --> [r, k] = setdiff(v1, v2);
    --> r, k
     r  =
    !aa  ba  cb  !
     k  =
       8.   3.   6.

## Смотрите также

- unique
- union
- members
- vectorfind

## История

< 5.0 Функция введена.
6.0.2 Добавлены опции "r" | "c", включая гиперматрицы.
6.1.0 Теперь допускаются комплексные числа.