Найдите всех соседей на заданном расстоянии с помощью входных данных
Найдите X
точки, которые находятся в пределах евклидова расстояния 1.5
каждого Y
точка. Оба X
и Y
являются выборками пятимерных нормально распределенных переменных.
rng('default') % For reproducibility X = randn(100,5); Y = randn(10,5); [Idx,D] = rangesearch(X,Y,1.5)
Idx=10×1 cell array
{[ 25 62 33 99 87 92 16]}
{[ 92 25]}
{[ 93 42 31 73 60 28 78 83 48 89 85]}
{[ 92 41]}
{[44 7 28 78 75 42 69 31 1 26 83 93]}
{[ 15 31 89 41 27 17 29 60 34]}
{[ 89]}
{1x0 double }
{1x0 double }
{1x0 double }
D=10×1 cell array
{[ 0.9546 1.0987 1.2730 1.3981 1.4140 1.4249 1.4822]}
{[ 1.4203 1.4558]}
{1x11 double }
{[ 1.1244 1.4672]}
{1x12 double }
{[1.2824 1.2843 1.3342 1.3469 1.4154 1.4237 1.4625 1.4626 1.4744]}
{[ 1.1739]}
{1x0 double }
{1x0 double }
{1x0 double }
В данном случае последние три Y
точек больше 1.5
расстояние от любого X
точка. X(89,:)
является 1.1739
расстояние от Y(7,:)
и никаких других X
точка находится в пределах расстояния 1.5
от Y(7,:)
. X
содержит 12
точки на расстоянии 1.5
от Y(5,:)
.
Сгенерируйте 5000 случайных точек из каждого из трех различных многомерных нормальных распределений. Сдвиньте средства распределений так, чтобы случайным образом сгенерированные точки, вероятно, сформировали три отдельных кластера.
rng('default') % For reproducibility N = 5000; dist = 10; X = [mvnrnd([0 0],eye(2),N); mvnrnd(dist*[1 1],eye(2),N); mvnrnd(dist*[-1 -1],eye(2),N)];
Для каждой точки в X
, найти точки в X
которые находятся в радиусе dist
подальше от точки. Для более быстрых расчетов задайте, чтобы сохранить индексы ближайших соседей несортированными. Выберите первую точку X и найдите ее ближайшие соседи.
Idx = rangesearch(X,X,dist,'SortIndices',false);
x = X(1,:);
nearestPoints = X(Idx{1},:);
Найдите значения в X
которые не являются ближайшими соседями x
. Отобразите эти точки в одном цвете и ближайших соседях x
в другом цвете. Пометьте точку x
с черным, заполненным кругом.
nonNearestIdx = true(size(X,1),1); nonNearestIdx(Idx{1}) = false; scatter(X(nonNearestIdx,1),X(nonNearestIdx,2)) hold on scatter(nearestPoints(:,1),nearestPoints(:,2)) scatter(x(1),x(2),'black','filled') hold off
Найти пациентов в patients
набор данных, которые находятся в пределах определенного возраста и области значений веса пациентов в Y
.
Загрузите patients
набор данных. The Age
значения указаны в годах, и Weight
значения указаны в фунтах.
load patients X = [Age Weight]; Y = [20 162; 30 169; 40 168]; % New patients
Создайте пользовательскую функцию расстояния distfun
что определяет расстояние между пациентами с точки зрения возраста и веса. Для примера, согласно distfun
два пациента с интервалом в один год и одинаковым весом находятся на расстоянии модуля друг от друга. Точно так же два пациента, которые имеют одинаковый возраст и имеют пять фунтов с разницей в весе, также находятся на расстоянии модуля друг от друга.
type distfun.m % Display contents of distfun.m file
function D2 = distfun(ZI,ZJ) ageDifference = abs(ZI(1)-ZJ(:,1)); weightDifference = abs(ZI(2)-ZJ(:,2)); D2 = ageDifference + 0.2*weightDifference; end
Примечание.Если нажать кнопку, расположенную в правом верхнем разделе этого примера, и открыть пример в MATLAB ®, MATLAB открывает папку примера. Эта папка включает файл функции distfun.m
.
Найти пациентов в X
которые находятся на расстоянии 2
пациентов в Y
.
[Idx,D] = rangesearch(X,Y,2,'Distance',@distfun)
Idx=3×1 cell array
{1x0 double}
{1x0 double}
{[ 41]}
D=3×1 cell array
{1x0 double}
{1x0 double}
{[ 1.8000]}
Третий пациент в Y
единственный, у кого есть пациент X
на расстоянии 2
.
Отобразите Age
и Weight
значения для ближайшего пациента в X
пациенту с возрастом 40
и весовые 168
.
X(Idx{3},:)
ans = 1×2
39 164
X
- Входные данныеВходные данные, заданные как mx -by n числовая матрица, где каждая строка представляет одну n -мерную точку. Количество n столбцов должно равняться количеству столбцов в Y
.
Типы данных: single
| double
Y
- Точки запросаТочки запроса, заданные как my -by n числовая матрица, где каждая строка представляет одну n -мерную точку. Количество n столбцов должно равняться количеству столбцов в X
.
Типы данных: single
| double
r
- Радиус поискаЗадайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
rangesearch(X,Y,1.4,'Distance','seuclidean','Scale',iqr(X))
задает, чтобы найти все наблюдения в X
на расстоянии 1.4
каждого наблюдения в Y
, с использованием стандартизированного евклидова расстояния, масштабируемого межквартильной областью значений X
.'NSMethod'
- Метод поиска по ближайшему соседу'kdtree'
| 'exhaustive'
Метод поиска по ближайшему соседу, заданный как разделенная разделенными запятой парами, состоящая из 'NSMethod'
и одно из этих значений.
Значение | Описание |
---|---|
'kdtree' | Создайте и используйте K d-дерево, чтобы найти ближайших соседей.
|
'exhaustive' | Используйте алгоритм исчерпывающего поиска. Программа вычисляет расстояния от всех X точки на каждый Y указать, чтобы найти ближайших соседей. |
'kdtree'
является значением по умолчанию, когда количество столбцов в X
меньше или равно 10
, X
не является разреженным, и метрика расстояния является одним из допустимых 'kdtree'
метрики. В противном случае значение по умолчанию является 'exhaustive'
.
Пример: 'NSMethod','exhaustive'
'Distance'
- Метрика расстояния'euclidean'
(по умолчанию) | 'seuclidean'
| 'mahalanobis'
| 'cityblock'
| 'minkowski'
| 'chebychev'
| указатель на функцию |...Метрика расстояния, которая rangesearch
использует, заданный как разделенная разделенными запятой парами, состоящая из 'Distance'
и одно из значений в этой таблице.
Значение | Описание |
---|---|
'euclidean' | Евклидово расстояние. |
'seuclidean' | Стандартизированное евклидово расстояние. Каждое различие координат между строкой в X и точка запроса масштабируется путем деления на соответствующий элемент стандартного отклонения, вычисленного из X , std(X,'omitnan') . Чтобы задать другое масштабирование, используйте 'Scale' аргумент пары "имя-значение". |
'mahalanobis' | Расстояние Махаланобиса, вычисленное с помощью положительной определенной ковариационной матрицы C . Значение по умолчанию C - выборочная ковариационная матрица X , в расчете на cov(X,'omitrows') . Чтобы задать другое значение для C , используйте 'Cov' аргумент пары "имя-значение". |
'cityblock' | Расстояние между блоками. |
'minkowski' | Расстояние Минковского. Экспонента по умолчанию 2 . Чтобы задать другую экспоненту, используйте 'P' аргумент пары "имя-значение". |
'chebychev' | Расстояние Чебычева (максимальное различие координат). |
'cosine' | Один минус косинус включенного угла между наблюдениями (обрабатывается как векторы). |
'correlation' | Один минус выборка линейной корреляции между наблюдениями (рассматривается как последовательности значений). |
'hamming' | Расстояние Хемминга, процент разных координат. |
'jaccard' | Один минус коэффициент Жаккара, процент ненулевых координат, которые различаются. |
'spearman' | Один минус выборки корреляции ранга Спирмана между наблюдениями (рассматриваются как последовательности значений). |
| Пользовательский указатель на функцию расстояния. Функция расстояния имеет вид function D2 = distfun(ZI,ZJ) % calculation of distance ...
|
Для получения дополнительной информации см. «Метрики расстояния».
Пример: 'Distance','minkowski'
'P'
- Экспонента для метрики расстояния Минковского2
(по умолчанию) | положительная скалярная величинаЭкспонента для метрики расстояния Минковского, заданная как разделенная разделенными запятой парами, состоящая из 'P'
и положительная скалярная величина. Этот аргумент действителен только в том случае, если 'Distance'
является 'minkowski'
.
Пример: 'P',4
Типы данных: single
| double
'Cov'
- Ковариационная матрица для метрики расстояния Махаланобисаcov(X,'omitrows')
(по умолчанию) | положительно определенную матрицуКовариационная матрица для метрики расстояния Махаланобиса, заданная как разделенная разделенными запятой парами, состоящая из 'Cov'
и положительно определенную матрицу. Этот аргумент действителен только при 'Distance'
является 'mahalanobis'
.
Пример: 'Cov',eye(4)
Типы данных: single
| double
'Scale'
- значение параметров для стандартизированной метрики Евклидова расстоянияstd(X,'omitnan')
(по умолчанию) | неотрицательный векторЗначение параметров для стандартизированной метрики Евклидова расстояния, заданное как разделенная разделенными запятой парами, состоящая из 'Scale'
и неотрицательный вектор. Scale
имеет длину, равную количеству столбцов в X
. Каждое различие координат между строкой в X
и точка запроса масштабируется соответствующим элементом Scale
. Этот аргумент действителен только при 'Distance'
является 'seuclidean'
.
Пример: 'Scale',iqr(X)
Типы данных: single
| double
'BucketSize'
- Максимальное количество точек данных в конечном узле K d-дерева50
(по умолчанию) | положительный целочисленный скалярМаксимальное количество точек данных в конечном узле K d-дерева, заданное как разделенная разделенными запятой парами, состоящая из 'BucketSize'
и положительный целочисленный скаляр. Этот аргумент действителен только при NSMethod
является 'kdtree'
.
Пример: 'BucketSize',20
Типы данных: single
| double
'SortIndices'
- Флаг для сортировки возвращенных индексов в соответствии с расстояниемtrue
(1
) (по умолчанию) | false
(0
)Флаг для сортировки возвращенных индексов в соответствии с расстоянием, заданный как разделенная разделенными запятой парами, состоящая из 'SortIndices'
и любой из них true
(1
) или false
(0
).
Для повышения эффективности при Y
содержит много наблюдений, которые имеют много ближайших точек в X
, можно задать SortIndices
на false
. В этом случае, rangesearch
возвращает индексы ближайших точек не в определенном порядке. Когда SortIndices
является true
функция упорядочивает индексы ближайших точек в порядке возрастания по расстоянию.
Пример: 'SortIndices',false
Типы данных: logical
Idx
- Индексы ближайших точекИндексы ближайших точек, возвращенные как массив ячеек из числовых векторов.
Idx
является my -by- 1
массив ячеек, где my количество строк в Y
. Векторная Idx{j}
содержит индексы точек (строк) в X
чьи расстояния до Y(j,:)
не больше r
. Если SortIndices
является true
, затем rangesearch
устанавливает индексы в порядке возрастания по расстоянию.
D
- Расстояния от ближайших точек до точек запросаРасстояния между ближайшими точками и точками запроса, возвращенные как массив ячеек из числовых векторов.
D
является my -by- 1
массив ячеек, где my количество строк в Y
. D{j}
содержит значения расстояния между Y(j,:)
и точки (строки) в X(Idx{j},:)
. Если SortIndices
является true
, затем rangesearch
устанавливает расстояния в порядке возрастания.
Для фиксированного положительного реального значения r
, rangesearch
находит все X
точки, которые находятся на расстоянии r
каждого Y
точка. Чтобы найти k точки в X
которые являются ближайшими к каждому Y
точка, для фиксированного положительного целого k, используйте knnsearch
.
rangesearch
не сохраняет объект поиска. Чтобы создать объект поиска, используйте createns
.
Обзор алгоритма k d-дерева см. в разделе k-Ближайший Соседний Поиск с использованием Kd-дерева.
Алгоритм исчерпывающего поиска находит расстояние от каждой точки в X
в каждую точку Y
.
Если вы устанавливаете rangesearch
функциональные 'NSMethod'
Аргумент пары "имя-значение" к соответствующему значению ('exhaustive'
для исчерпывающего алгоритма поиска или 'kdtree'
для K алгоритма d-tree), тогда результаты поиска эквивалентны результатам, полученным путем проведения поиска на расстоянии с помощью rangesearch
функция объекта. В отличие от rangesearch
функции, rangesearch
функция объекта требует ExhaustiveSearcher
или KDTreeSearcher
объект модели.
Указания и ограничения по применению:
Если X
является длинный массив, тогда Y
не может быть длинный массив. Точно так же, если Y
является длинный массив, тогда X
не может быть длинный массив.
Для получения дополнительной информации см. Раздел «Длинные массивы»
Указания и ограничения по применению:
Для генерации кода, значение по умолчанию для 'NSMethod'
Аргумент пары "имя-значение" 'exhaustive'
когда количество столбцов в X
больше 7.
Значение 'Distance'
аргумент пары "имя-значение" должен быть константой времени компиляции и не может быть пользовательской функцией расстояния.
The 'SortIndices'
аргумент пары "имя-значение" не поддерживается. Выходные аргументы всегда сортируются.
Имена в аргументах пары "имя-значение" должны быть константами во время компиляции. Для примера, чтобы разрешить заданную пользователем степень для расстояния Минковского в сгенерированном коде, включите {coder.Constant('Distance'),coder.Constant('Minkowski'),coder.Constant('P'),0}
в -args
значение codegen
(MATLAB Coder).
Отсортированный порядок связанных расстояний в сгенерированном коде может отличаться от порядка в MATLAB® из-за численной точности.
Когда rangesearch
использует алгоритм поиска kd-дерева, и тип сборки генерации кода является MEX-функцией, codegen
(MATLAB Coder) генерирует MEX-функцию с помощью Intel® Многопоточные базовые блоки (TBB) для параллельных расчетов. В противном случае, codegen
генерирует код используя parfor
(MATLAB Coder).
MEX-функция для алгоритма поиска kd-дерева - codegen
генерирует оптимизированную MEX-функцию, используя Intel TBB для параллельных расчетов на многоядерных платформах. Можно использовать MEX-функцию для ускорения алгоритмов MATLAB. Для получения дополнительной информации о Intel TBB смотрите https://software.intel.com/en-us/intel-tbb.
Если вы генерируете MEX-функцию, чтобы протестировать сгенерированный код parfor
версию можно отключить при использовании Intel TBB. Установите ExtrinsicCalls
свойство объекта строения MEX, чтобы false
. Для получения дополнительной информации смотрите coder.MexCodeConfig
(MATLAB Coder).
MEX-функция для алгоритма исчерпывающего поиска и автономный код C/C + + для обоих алгоритмов - Сгенерированный код rangesearch
использование parfor
(MATLAB Coder), чтобы создать циклы, которые выполняются параллельно на поддерживаемых многоядерных платформах общей памяти в сгенерированном коде. Если ваш компилятор не поддерживает интерфейс приложения Open Multiprocessing (OpenMP) или вы отключаете библиотеку OpenMP, MATLAB Coder™ обрабатывает parfor
-циклы как for
-циклы. Поиск поддерживаемых компиляторов см. в разделе Поддерживаемые компиляторы. Чтобы отключить библиотеку OpenMP, установите EnableOpenMP
свойство объекта строения, чтобы false
. Для получения дополнительной информации смотрите coder.CodeConfig
(MATLAB Coder).
Начиная с R2020a, rangesearch
возвращает целый тип (int32
) индексы, а не индексы двойной точности, в сгенерированном автономном коде C/C + +. Поэтому функция допускает строгую поддержку с одной точностью, когда вы используете входы с одной точностью. Для генерации кода MEX функция все еще возвращает индексы двойной точности, чтобы соответствовать поведению MATLAB.
Для получения дополнительной информации о генерации кода смотрите Введение в генерацию кода и Рабочий процесс генерации общего кода.
createns
| ExhaustiveSearcher
| KDTreeSearcher
| knnsearch
| pdist2
| rangesearch
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.