Scilab Website | Contribute with GitLab | Mailing list archives | ATOMS toolboxes
Scilab Online Help
2024.1.0 - Русский


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 — даёт индексы элементов с ненулевым значением или значением %T
  • tabul — frequency of values of a matrix or vector
Report an issue
<< Поиск и сортировка Поиск и сортировка find >>

Copyright (c) 2022-2024 (Dassault Systèmes)
Copyright (c) 2017-2022 (ESI Group)
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Mon Jun 17 17:55:05 CEST 2024