unique extrait (et trie) les éléments distincts d'un vecteur, matrice, hypermatrice

## Séquence d'appel

                [U, km, ku, nb] = unique(M)
                [U, km, ku, nb] = unique(M, orient)
                [U, km, ku, nb] = unique(.., "keepOrder")
                [U, km, ku, nb] = unique(.., "uniqueNan")

## Paramètres

M

  vecteur, matrice, ou hypermatrice de booléens, de nombres, ou de textes. Les matrices numériques ou booléennes creuses sont acceptées.

orient

  1 ou "r", 2 ou "c". Ne peut pas être utilisé si `M` est une hypermatrice.

U

  - Sans `orient`: vecteur d'éléments de `M` triés par ordre croissant. Si `M` est un vecteur ligne, `U` aussi. Dans tous les autres cas, `U` est un vecteur colonne.

  - Avec `orient`: Matrice de lignes ou de colonnes extraites de `M`, triées par ordre lexicographique croissant.

  `U` est toujours creuse si en entrée `M` l'est.

km

  Indices des éléments, lignes ou colonnes extraits, tels que `U = M(km)` ou `U = M(km,:)` ou `U = M(:,km)`.

  `km` est un vecteur ligne si `M` l'est aussi ou si `orient="c"` est utilisé. Sinon `km` est en colonne.

ku
  Vecteur, matrice ou hypermatrice d'indices dans U, tel que, selon l'option `orient`
  - "*": `ku` est de taille size(M), avec `U(ku) = M`
  - "r": `ku` est de taille [size(M,1), 1], avec `U(ku,:) = M`
  - "c": `ku` est de taille [1, size(M,2)], avec `U(:,ku) = M`

  `ku` est dense, y compris lorsque `M` est creuse et que le mode simple "*" est utilisé.
nb

  Vecteur d'entiers > 0, au format de `km` : nombres d'exemplaires dans `M` de chaque entité (élément, ligne, colonne) retournée dans `U`.

## Description

`unique(M)` renvoie un vecteur contenant les valeurs distinctes contenues dans les termes de `M` classées par ordre croissant.

`unique(M,"r")` ou `unique(M,1)`retourne les lignes uniques de `M` triées dans l'ordre lexicographique croissant.

`unique(M,"c")` or `unique(M,2)`retourne les colonnes uniques `M` triées dans l'ordre lexicographique croissant.

`unique(M,.. "keepOrder")` donne le vecteur des valeurs distinctes de `M` selon leur ordre initial d'apparition dans `M` (au lieu d'être par défaut triées par ordre croissant). L'indicateur `"keepOrder"` est insensible aux minuscules/majuscules.

`unique(M,.. "uniqueNan")` considère toute valeur Nan comme égale à toute autre Nan, et les dédoublonne comme pour n'importe quelle autre valeur numérique. Par défaut, toute valeur Nan est distincte de toute autre Nan, y compris elle-même : `%nan<>%nan` est vrai, à moins d'utiliser `"uniqueNan"`. L'indicateur `"uniqueNan"` est insensible aux minuscules/majuscules.

Pour un tableau de booléens, `unique(…)` sera utile principalement avec les options "r" ou "c".

Les nombres complexes sont triés par modules croissants, puis par phases croissantes sur [-π, π].

## Exemples

Dédoublonnement de nombres :

    M = int8([2  0  2  2  1  1  1  2  1  1  0  1  1  0  1  1
              0  1  2  0  1  2  2  0  1  1  2  0  1  0  0  0
              ])
    [u, km] = unique(M)
    [uc, kmc] = unique(M, "c")

    --> M
     M =
      2  0  2  2  1  1  1  2  1  1  0  1  1  0  1  1
      0  1  2  0  1  2  2  0  1  1  2  0  1  0  0  0

    --> [u, km] = unique(M)
     u  =
      0
      1
      2

     km  =
       2.
       4.
       1.

    --> [uc, kmc] = unique(M, "c")
     uc  =
      0  0  0  1  1  1  2  2
      0  1  2  0  1  2  0  2

     kmc  =
       14.   2.   11.   12.   5.   6.   1.   3.

Dédoublonnement de nombres complexes :

    i = %i;
    c = [1+i, 1-i, -i, i, -i, 1+i]
    [u, k] = unique(c)
    [uc, kc] = unique(c, "c")

    --> c = [1+i, 1-i, -i, i, -i, 1+i]
     c  =
       1. + i    1. - i    0. - i    0. + i    0. - i    1. + i

    --> [u, k] = unique(c)
     u  =
       0. - i    0. + i    1. - i    1. + i
     k  =
       3.   4.   2.   1.

    --> [uc, kc] = unique(c, "c")
     uc  =
       0. - i    0. + i    1. - i    1. + i
     kc  =
       3.   4.   2.   1.

Dédoublonnement de textes :

    t = ["BA" "BB" "AB" "BA" "AB" "BA" "AB" "AB" "BA" "AA" "AB" "BA" "BA" "BA" "AA"
         "AA" "AB" "AA" "AA" "BB" "BB" "BB" "BA" "AB" "AB" "BB" "BB" "AB" "AB" "AA"
        ]
    u = unique(t)'
    [u, kt, ku, nb] = unique(t(1,:))
    [u, kt] = unique(t(1,:), "keepOrder")        // ordre initial conservé
    [uc, ktc, kuc, nb] = unique(t, "c")
    [uc, ktc, kuc, nb] = unique(t, "c", "keepOrder")  // ordre initial des colonnes conservé
    [and(t(:,ktc)==uc), and(uc(:,kuc)==t) ]

    --> t = ["BA" "BB" "AB" "BA" "AB" "BA" "AB" "AB" "BA" "AA" "AB" "BA" "BA" "BA" "AA"
      >      "AA" "AB" "AA" "AA" "BB" "BB" "BB" "BA" "AB" "AB" "BB" "BB" "AB" "AB" "AA"
      >     ]
     t  =
    !BA  BB  AB  BA  AB  BA  AB  AB  BA  AA  AB  BA  BA  BA  AA  !
    !AA  AB  AA  AA  BB  BB  BB  BA  AB  AB  BB  BB  AB  AB  AA  !

    --> u = unique(t)'
     u  =
    !AA  AB  BA  BB  !

    --> [u, kt, ku, nb] = unique(t(1,:))
     u  =
    !AA  AB  BA  BB  !

     kt  =
       10.   3.   1.   2.

     nb  =
       2.   5.   7.   1.

    --> [u, kt] = unique(t(1,:), "keepOrder")  // ordre initial conservé
     u  =
    !BA  BB  AB  AA  !

     kt  =
       1.   2.   3.   10.

    --> [uc, ktc, kuc, nb] = unique(t, "c")
     uc  =
    !AA  AA  AB  AB  AB  BA  BA  BA  BB  !             colonnes triées
    !AA  AB  AA  BA  BB  AA  AB  BB  AB  !

     ktc  =
       15.   10.   3.   8.   5.   1.   9.   6.   2.

     nb  =
       1.   1.   1.   1.   3.   2.   3.   2.   1.

    --> [uc, ktc, kuc, nb] = unique(t, "c", "keepOrder")  // ordre initial des colonnes conservé
     uc  =
    !BA  BB  AB  AB  BA  AB  BA  AA  AA  !
    !AA  AB  AA  BB  BB  BA  AB  AB  AA  !

     ktc  =
       1.   2.   3.   5.   6.   8.   9.   10.   15.

     nb  =
       2.   1.   1.   3.   2.   1.   3.   1.   1.

    --> [and(t(:,ktc)==uc), and(uc(:,kuc)==t) ]
     ans  =
      T  T

Avec des valeurs Nan (et Inf). Option "uniqueNan" :

    M = [2  2  %nan  1     2  0     1  %nan  0    %nan
         1  0  1     %nan  0  %inf  0  1     %inf 1
        ];
    [v, km, kv, n] = unique(M); v',n'
    [v, km, kv, n] = unique(M, "uniqueNan"); v',n'
    unique(M, "c")
    [v, kmc, kvc, n] = unique(M, "c", "uniqueNan")

    --> M
     M  =
       2.   2.   Nan   1.    2.   0.    1.   Nan   0.    Nan
       1.   0.   1.    Nan   0.   Inf   0.   1.    Inf   1.

    --> [v, km, kv, n] = unique(M); v',n'
     ans  =
       0.   1.   2.   Inf   Nan   Nan   Nan   Nan

     ans  =
       5.   6.   3.   2.   1.   1.   1.   1.

    --> [v, km, kv, n] = unique(M, "uniqueNan"); v',n'
     ans  =
       0.   1.   2.   Inf   Nan

     ans  =
       5.   6.   3.   2.   4.

    --> unique(M, "c")
     ans  =
       0.    1.   1.    2.   2.   Nan   Nan   Nan
       Inf   0.   Nan   0.   1.   1.    1.    1.

    --> [v, kmc, kvc, n] = unique(M, "c", "uniqueNan")
     v  =
       0.    1.   1.    2.   2.   Nan
       Inf   0.   Nan   0.   1.   1.

     kmc  =
       6.   7.   4.   2.   1.   3.

     n  =
       2.   1.   1.   2.   1.   3.

## Voir aussi

- members
- gsort
- vectorfind
- grep
- union
- intersect

## Historique

6.0.2 unique() peut maintenant être utilisée pour dédoublonner des nombres complexes.
6.1.0

- Extension aux booléens.
- Options "keepOrder" et "uniqueNan" ajoutées.
- 4ème résultat `nb` ajouté.

6.1.1 3ème résultat ku implémenté. Les matrices creuses 2D sont désormais acceptées.