members 配列の各要素または他の配列の行または列を数える(及び位置を調べる)

## 呼び出し手順

                [nb [,loc]] = members(N, H)
                [nb [,loc]] = members(N, H, "last")
                [nb [,loc]] = members(N, H, "rows"|"cols")
                [nb [,loc]] = members(N, H, "rows"|"cols", "last")
                [nb [,loc]] = members(N, H, "rows"|"cols", "shuffle")
                [nb [,loc]] = members(N, H, "rows"|"cols", "shuffle", "last")

## 引数

N

  Needles: 論理値, 整数エンコードされた数値, 実数または複素数の10進数, 多項式またはテキストの行列またはハイパー行列. "rows"または"cols"モードでは, ハイパー行列は指定できません. 指定した値(または行または列)は`N`の中に 複数回配置することができます.

H

  Haystack: `N`と同じデータ型の行列またはハイパー行列. "rows" または "cols" モードの場合, ハイパー行列は指定できません. `N` および `H` はそれぞれ同じ列または行の数を有する必要があります.

オプション:

  以下の1から3個のオプションを順を問わず指定可能です:

  "last"

    `N`から needlesの`H`の位置を`loc`で 検索した場合, デフォルトで`H`の中でそれぞれが最初に現れる位置が返されます.

  "rows", "cols"

    デフォルトで, `N`の各要素`N(i, j, ...)` は `H`の中で検索する際のneedleとみなされます. `"rows"` が検索された場合, `N`の各行はneedleとみなされ, 全体として, `H`の行で検索が行われます. `"cols"` が使用された場合, `"cols"`が `N` 及び `H`の列に適用されます. `"cols"` を使用した場合, `N` 及び `H` の列数と同じ部分に 適用されます.

  "shuffle"

    `"rows"`または`"cols"` モードの場合, 行/列の要素のデフォルトの順序が考慮されます: 例えば,`N` の `[ 7 3 5 ]` は, `H`の`[3 5 7]`にマッチしません. `"shuffle"` が指定された場合, 例えば`[3 5 7]`の交換は `N`の`[3 5 7]`行に一致すると みなされます. このオプションは多項式の場合,無視されます.

nb

  通常モードの場合: `nb(i, j, ...)` は(実数として) `H`における`N(i, j, ...)`の出現回数 を表します. `nb` および `N` は同じ形式です. `H` が空の場合, ゼロ行列が返されます. `N` が空の場合, 空の行列 `[]` が返されます.

  `"rows"` または `"cols"` モードの場合: `nb` は `N` が有する行/列と同じ数の要素を 有する実数の行です. `nb(i)` は,`H(., :)` の中で `N(i, :)` が生じた数 (または`H(:, .)`の中で`N(:, i)`)を返します.

loc

  通常のモードの場合: `loc` および`N` は同じ形式を有します. `loc(i, j, ...)` は, `N(i, j, ...)` がある場所として `H`に最小の線形化された添字を返します. `"last"`フラグが使用された場合, 替りに最大の線形化された添字の最大値が返されます. `H`の中に `N(i, j, ...)`が見つかれない場合, `loc(i, j, ...)` は `0`に設定されます.

  `"rows"` または `"cols"` モードの場合: `loc` は`N`が有する行及び列と同じ 数の要素を有する実数の行です. `loc(i)` は, `N(i, :)`に一致する最初の 行`H(loc(i), :)`の添字 (または `N(:, i)`に一致する最初の列 `H(:, loc(i))` の添字)を返します. `"shuffle"`フラグが追加で指定された場合, 行/列に基づく要素の順番は考慮されません.

## 説明

`nb = members(N, H [,"rows"|"cols"])` は各要素または`H`の中にある `N`の行または列の発生回数を返します. 要素が見つからない場合, 0 が返されます. `N(i,j,...)`が現れる最初(デフォルト)または `"last"`(最後)の`H`の添字を, 2番目のオプションの出力`loc`により取得できます. `"rows"` または `"cols"` の一致するものを探す場合, オプション`"shuffle"`を使用することにより, 一致の際の要素の順番を無視することができます.

値 `%inf` および `-%inf` を`N`の中および`H`の中で 使用することができます. ノーマルモードでは, `%nan`が`N`の中では サポートされますが,`H`の中ではサポートされません. `"rows"` または `"cols"` モードの場合, `%nan` はどこでもサポートされます.

通常の要素毎のモードの場合, members(..) は, 論理値, 整数エンコードされた数値(8-16-32ビット長の符号ありまたは無し) および実数を高速に処理するために dsearch(..) を使用します. 計算時間が長い場合, 進行状況の棒グラフが表示されます.

## 例

    N = [1 8 4 5 2 1];
    H = [9 7 4 2 1 4];

    [nb, loc] = members(N, H, "last")
    // nb  = [1 0 2 0 1 1] を返す: 例えば, Hの中に4が2回現れる.
    // そして loc = [5 0 6 0 4 5]: 4が最後に現れるのはHの6番目の位置

    [nb, loc] = members(N, H)
    // loc = [5 0 3 0 4 5]を返す: 4が最初に現れるのはHの3番目の位置

    // ハイパー行列の場合. 前記の N 及び Hを利用:
    N = matrix(N, [3 1 2]);
    H = matrix(H, [3 1 2]);
    [nb, loc] = members(N, H, "last")

    // 整数の場合:
    N = int8(grand(3, 2, "uin", -5, 5));
    H = int8(grand(4, 4, "uin", -5, 5));
    [nb, loc] = members(N, H)

    // 多項式の場合 (複素数の係数を指定可能):
    z = %z;
    N = [z (1-z)^2 ; -4 %i*z ];
    H = [2  %i*z -z  3-z  z  z^3 z];
    [nb, loc] = members(N, H)

    // テキストの場合:
    N = [ "Hi" "Hu" "Allo"];
    H = [ "Hello" "Bonjour" "Allo"
          "Holà"  "Allo"  "Hallo"
          "Hi"    "Hé"    "Salud" ];
    [nb, loc] = members(N, H, "last")

    // 行の場合:
     H = [
      3  3  0
      4  1  0
      2  0  3
      0  1  4
      3  4  3
      0  4  1
      3  1  0
      ];
     N = [
      1  2  3
      0  1  4
      3  0  3
      4  1  0
      2  0  2
      ];
     N, H
     [nb, loc] = members(N, H, "rows")
     [nb, loc] = members(N, H, "rows","last")
     [nb, loc] = members(N, H, "rows","shuffle") // [4 1 0], [0 1 4] 及び [0 4 1] は同一とみなされる

     // 列の場合: 定義済みの N 及び H を利用:
     N = N.', H = H.'
     [nb, loc] = members(N, H, "cols", "shuffle")

## 参照

- dsearch
- intersect
- grep
- find
- vectorfind

## 履歴

5.5.0 members() 関数が導入されました.