📄 nndemo.m
字号:
%% NEARESTNEIGHBOUR Demonstration
% This (publishable) script |nndemo.m| demonstrates the features of the
% nearestneighbour function.
%% Summary
% |nearestneighbour| computes nearest neighbours to a set of points from a
% set of candidate points by Euclidean distance. Points are considered to
% be matrix columns.
% It has a number of convenient features which might make it worth using
% rather than simply coding a couple-of-lines search into an m-file. These
% include:
%
%%
%
% * Specifying points as either a separate matrix, or as indices into the
% candidate matrix
% * Finding Multiple Neighbours
% * Automatically using Delaunay Triangulation if it would be faster
%
%% Example 1: Basic nearest neighbour search
% 2D points of interest
P = rand(2, 5);
% Candidate point set
X = rand(2, 50);
I = nearestneighbour(P, X);
disp('Candidate points:')
disp(P)
disp('Nearest neighbours')
disp(X(:, I))
% Plot the points
figure(1);plot(X(1,:), X(2,:), 'b.', P(1,:), P(2,:), 'r.', 'MarkerSize', 15);
hold on
quiver(P(1, :), P(2, :), X(1,I) - P(1, :), X(2, I) - P(2, :), 0, 'k');
hold off
%% Example 2: Nearest neighbour to subset of a point set
% Sometimes the features of interest will be certain members of a set, and
% you want to find the closest point(s) from within the set
% Candidate 4D feature set
X = rand(4, 20);
% Find nearest neighbour to the 2nd, 4th, 10th features
I = nearestneighbour([2 4 10], X)
% Find nearest neighbours to all columns of X
I = nearestneighbour(X)
%% Example 3: Finding nearest n neighbours
% Let's calculate the four nearest neighbours to a point
% three points of interest
P = rand(2, 3);
% Candidate feature set
X = rand(2, 50);
% Calculate the 4 nearest neighbours to each point: I(:, 1) will be the 4
% nearest neighbours to P(:, 1), etc.
I = nearestneighbour(P, X, 'NumberOfNeighbours', 4)
% Plot the points - show the neighbours for one of them
figure(2);plot(P(1,:), P(2, :), 'r.', X(1,:), X(2,:), 'b.', 'MarkerSize', 15)
hold on
p1 = repmat(P(1,1), 1, 4); p2 = repmat(P(2,1), 1, 4);
quiver(p1, p2, X(1, I(:, 1)) - p1, X(2, I(:, 1)) - p2, 0, 'k')
hold off
%% Example 4: DelaunayMode - Large Data set, few points to lookup
% We'll run a couple of examples and show how |nearestneighbour|
% automatically works out when to use the Delaunay triangulation.
% You may need to tweak the
% numbers of zeros to get meaningful results on your computer.
% First we'll try a large data set with few points to lookup - it shouldn't use Delaunay
% Triangulation as the overhead required to compute this should definitely
% offset any gains. We'll run |nearestneighbour| with DelaunayMode 'on',
% 'off', and 'auto'.
% Note that the numbers are fairly conservative to avoid crashing slow
% computers with this demo!
% Large Data set, few points to look up
P = rand(3, 10);
X = rand(3, 5000);
fprintf('Delaunay mode test: Large data set, few candidate points:\n')
% Run with DelaunayMode off
fprintf('Elapsed Time (DelaunayMode off) : %.2g seconds\n', ...
timingtest(P, X, 'off'))
% Run with DelaunayMode on
fprintf('Elapsed Time (DelaunayMode on) : %.2g seconds\n', ...
timingtest(P, X, 'on'))
% Run with DelaunayMode automatic - note 'auto' is the default
fprintf('Elapsed Time (DelaunayMode auto): %.2g seconds\n\n', ...
timingtest(P, X, 'auto'))
%% Example 5: DelaunayMode - smallish data set, lots of points to lookup
% If there are lots of points to lookup, however, using the Delaunay
% Triangulation should be an advantage
% Small Data set, lots of candidate points
P = rand(3, 10000);
X = rand(3, 500);
fprintf('Delaunay mode test: Small data set, many candidate points:\n')
% Run with DelaunayMode off
fprintf('Elapsed Time (DelaunayMode off) : %.2g seconds\n', ...
timingtest(P, X, 'off'))
% Run with DelaunayMode on
fprintf('Elapsed Time (DelaunayMode on) : %.2g seconds\n', ...
timingtest(P, X, 'on'))
% Run with DelaunayMode automatic
fprintf('Elapsed Time (DelaunayMode auto): %.2g seconds\n', ...
timingtest(P, X, 'auto'))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -