dsearch поиск в упорядоченных наборах

## Синтаксис

                [ind, occ, info] = dsearch(X, s )
                [ind, occ, info] = dsearch(X, s , ch )

## Аргументы

X

  матрица чисел двойной точности размером mx на nx, для которой необходимо определить расположение элементов.

s

  матрица чисел двойной точности размером n на 1 или 1 на n, интервалы (если ch="c") или набор (если ch="d"). Значения в s должны быть в строго возрастающем порядке: s(1) < s(2) < ... < s(n)

ch

  матрица строковых значений размером 1 на 1, тип поиска (по умолчанию ch="c"). Возможными значениями являются ch="c" или ch="d".

ind

  матрица чисел двойной точности размером mx на nx. Расположение значений X на интервалах или наборе, определённых s.

occ

  Если ch="c", то (n-1) на 1 или 1 на (n-1) чисел двойной точности. Если ch="d", то n на 1 или 1 на n чисел двойной точности. Количество элементов X на интервалах s.

info

  матрица чисел двойной точности размером 1 на 1. Количество элементов X, которые не входят в интервал(ы).

## Описание

Эта функция определяет местоположение индексов элементов в X на интервалах или наборах, определённых s.

Если `ch="c"` (по умолчанию), рассматриваются интервалы `I1 = [s(1), s(2)]` и `Ik = (s(k), s(k+1)]` для `k=2,...,n-1`. Заметьте, что границы `I1` закрыты, а левые границы `I2`, ..., `In` открыты. Для каждого элемента `X(i)` ищется интервал `Ik`, который содержит X(i), т. е. ищется такое k, что `s(k)<X(i)<=s(k+1)`.

Более точно,

ind(i)

  такое k, что `Ik` содержит X(i) или 0, если X(i) не находится ни на одном из интервалов `Ik`.

occ(k)

  число компонентов `X`, которые располагаются на `Ik`.

info

  число компонентов `X`, которые не располагаются ни на одном из интервалов `Ik`.

Если `ch="d"`, то рассматривается набор {s(1),s(2),...,s(n)}. Для каждого X(i) ищется такое k, что X(i)=s(k).

Более точно,

ind(i)

  равно k, если X(i)=s(k) или 0, если X(i) не располагается в s.

occ(k)

  число элементов X, равное s(k)

info

  число элементов X, которые не располагаются в наборе {s(1),...,s(n)}.

Опция ch="c" может быть использована для эмпирической гистограммы функции, давшей набор данных. Опция ch="d" может быть использована для подсчёта элементов X, которые представлены в наборе s.

## Примеры

В следующем примере мы рассматриваем 3 интервала `I1=[5,11]`, `I2=(11,15]` и `I3=(15,20]`. Мы ищем расположение элементов `X=[11 13 1 7 5 2 9]` в этих интервалах.

    [ind, occ, info] = dsearch([11 13 1 7 5 2 9], [5 11 15 20])

Предыдущий пример даёт следующий выход.

    -->[ind, occ, info] = dsearch([11 13 1 7 5 2 9], [5 11 15 20])
     info  =
        2.
     occ  =
        4.    1.    0.
     ind  =
        1.    2.    0.    1.    1.    0.    1.

Теперь поясним эти результаты.

- X(1)=11 находится в интервале I1, следовательно ind(1)=1.

- X(2)=13 находится в интервале I2, следовательно ind(2)=2.

- X(3)=1 не находится ни в одном из интервалов, следовательно ind(3)=0.

- X(4)=7 находится в интервале I1, следовательно ind(4)=1.

- X(5)=5 находится в интервале I1, следовательно ind(5)=1.

- X(6)=2 не находится ни в одном из интервалов, следовательно ind(6)=0.

- X(7)=9 находится в интервале I1, следовательно ind(7)=1.

- В I1 четыре элемента X (5, 7, 9 и 11), следовательно occ(1)=4.

- В I2 один элемент (т. е. 13), следовательно occ(2)=1.

- В I3 ни одного элемента X, следовательно occ(3)=0.

- Есть два элемента X (т. е. 1, 2), которые не находятся ни в одном из интервалов, следовательно info=2.

В следующем примере мы рассматриваем набор [5 11 15 20] и ищем расположение элементов X в этом наборе.

    [ind, occ, info] = dsearch([11 13 1 7 5 2 9], [5 11 15 20],"d" )

Предыдущий пример производит следующий вывод.

    -->[ind, occ, info] = dsearch([11 13 1 7 5 2 9], [5 11 15 20],"d" )
     info  =
        5.
     occ  =
        1.    1.    0.    0.
     ind  =
        2.    0.    0.    0.    1.    0.    0.

Далее представим детальное пояснение предыдущим результатам.

- X(1)=11 находится в наборе val в позиции №2, следовательно ind(1)=2.

- X(2)=13 не находится в наборе, следовательно ind(2)=0.

- X(3)=1 не находится в наборе, следовательно ind(3)=0.

- X(4)=7 не находится в наборе, следовательно ind(4)=0.

- X(5)=5 находится в наборе val в позиции №1, следовательно ind(5)=1.

- X(6)=2 не находится в наборе, следовательно ind(6)=0.

- X(7)=9 не находится в наборе, следовательно ind(7)=0.

- Есть один элемент X (т. е. 5-й), равный 5, следовательно occ(1)=1.

- Есть один элемент X (т. е. 1-й), равный 11, следовательно occ(2)=1.

- Нет элементов, соответствующих val(3), следовательно occ(3)=0.

- Нет элементов, соответствующих val(4), следовательно occ(4)=0.

- Есть пять элементов X (т. е. 13, 1, 7, 2, 9), которые не входят в набор, следовательно info=5.

Значения в `s` должны идти в порядке возрастания при любом значении опции `ch`. В противном случае будет сформирована ошибка, как в следующем примере.

    -->dsearch([11 13 1 7 5 2 9], [2 1])
    !--error 999
    dsearch   : the array val (arg 2) is not well ordered
    -->dsearch([11 13 1 7 5 2 9], [2 1],"d")
    !--error 999
    dsearch   : the array val (arg 2) is not well ordered

## Более сложные примеры

В следующем примере мы сравним эмпирическую гистограмму случайных равновероятных чисел на интервале [0,1) с функцией равновероятного распределения. Чтобы выполнить это сравнение, мы используем алгоритм поиска по умолчанию, основанный на интервалах (ch="c"). Сформируем X в виде набора случайных равновероятных чисел на интервале [0,1). Возьмём n=10 значений лежащих на одинаковом расстоянии друг от друга на интервале [0,1] и примем связанные интервалы. Затем подсчитаем число элементов в X, которые попали в эти интервалы: это эмпирическая гистограмма функции равновероятного распределения. Ожидается, что occ/m равно 1/(n-1).

    m = 50000 ;
    n = 10;
    X = grand(m,1,"def");
    s = linspace(0,1,n)';
    [ind, occ] = dsearch(X, s);
    e = 1/(n-1)*ones(1,n-1);
    scf() ;
    plot(s(1:n-1), occ/m,"bo");
    plot(s(1:n-1), e,"r-");
    legend(["Эксперимент","Ожидание"]);
    xtitle("Случайные равновероятные числа","X","P(X)");

В следующем примере мы сравним гистограмму случайных чисел с биномиальным законом распределения с функцией биномиального закона распределения B(N,p), с N=8 и p=0,5. Чтобы выполнить это сравнение, мы используем алгоритм дискретного поиска, основанный на наборе (ch="d").

    N = 8 ;
    p = 0.5;
    m = 50000;
    X = grand(m,1,"bin",N,p);
    s = (0:N)';
    [ind, occ] = dsearch(X, s, "d");
    Pexp = occ/m;
    Pexa = binomial(p,N);
    scf() ;
    plot(s,Pexp,"bo");
    plot(s,Pexa',"r-");
    xtitle("Биномиальное распределение B(8,0.5)","X","P(X)");
    legend(["Эксперимент","Ожидание"]);

В следующем примере мы используем кусочные полиномы Эрмита для интерполяции набора данных.

          // определяем основные функции Эрмита
          function y=Ll(t,k,x)
            // Lagrange left on Ik
            y=(t-x(k+1))./(x(k)-x(k+1))
          endfunction
          function y=Lr(t,k,x)
            // Lagrange right on Ik
            y=(t-x(k))./(x(k+1)-x(k))
          endfunction
          function y=Hl(t,k,x)
            y=(1-2*(t-x(k))./(x(k)-x(k+1))).*Ll(t,k,x).^2
          endfunction
          function y=Hr(t,k,x)
            y=(1-2*(t-x(k+1))./(x(k+1)-x(k))).*Lr(t,k,x).^2
          endfunction
          function y=Kl(t,k,x)
            y=(t-x(k)).*Ll(t,k,x).^2
          endfunction
          function y=Kr(t,k,x)
            y=(t-x(k+1)).*Lr(t,k,x).^2
          endfunction

          x = [0 ; 0.2 ; 0.35 ; 0.5 ; 0.65 ; 0.8 ;  1];
          y = [0 ; 0.1 ;-0.1  ; 0   ; 0.4  ;-0.1 ;  0];
          d = [1 ; 0   ; 0    ; 1   ; 0    ; 0   ; -1];
          X = linspace(0, 1, 200)';
          ind = dsearch(X, x);

          // построение кривой
          Y = y(ind).*Hl(X,ind) + y(ind+1).*Hr(X,ind) + d(ind).*Kl(X,ind) + d(ind+1).*Kr(X,ind);
          scf();
          plot(X,Y,"k-");
          plot(x,y,"bo")
          xtitle("кусочный полином Эрмита");
          legend(["Полином","Данные"]);
          // Примечание : можете проверить, добавив это :
          // YY = interp(X,x,y,d); plot2d(X,YY,3,"000")

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

- find
- tabul