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")
Смотрите также
Report an issue | ||
<< Поиск и сортировка | Поиск и сортировка | find >> |