Source code for
vl_demo_kdtree.m
This file is located in the toolbox/demo folder in VLFeat package.
function vl_demo_kdtree
% VL_DEMO_KDTREE
% Demonstrates the construction of a kd-tree for uniformly
% distributed 2-D data and data distributed on a circle. Both the
% median and mean threshold selection methods are illustrated.
randn('state',0) ;
rand('state',0) ;
% uniform 2D points
Q = single(rand(2,1)) ;
X = single(rand(2, 100)) ;
% kd-tree with median and mean thresholds
figure(1) ; clf ; do('thresholdmethod', 'mean') ;
figure(2) ; clf ; do('thresholdmethod', 'median') ;
% 2D points on a circle
thr = 2*pi*rand(1,100) ;
X = single(.4*[cos(thr); sin(thr)] + .5) ;
Q = single(Q) ;
% kd-tree with median and mean thresholds
figure(3) ; clf ; do('thresholdmethod', 'mean') ;
figure(4) ; clf ; do('thresholdmethod', 'median') ;
vl_demo_print(1, 'kdtree_uniform_mean') ;
vl_demo_print(2, 'kdtree_uniform_median') ;
vl_demo_print(3, 'kdtree_circle_mean') ;
vl_demo_print(4, 'kdtree_circle_median') ;
function do(varargin)
% build the forest
kdforest = vl_kdtreebuild (X, 'verbose', varargin{:}) ;
% query the kd-tree
[i, d] = vl_kdtreequery (kdforest, X, Q, 'numneighbors', 10, 'verbose') ;
vl_plotframe(X, 'ro') ;
hold on ;
xl = [0, +1] ;
yl = [0, +1] ;
axis equal ;
xlim(xl) ;
ylim(yl) ;
vl_demo_kdtree_plot(kdforest.trees(1), 1, xl, yl) ;
% plot query point and returns
vl_plotframe(Q,'b*') ;
for k=1:length(i)
vl_plotframe([Q ; sqrt(d(k))],'b:','linewidth',1) ;
vl_plotframe(X(:, i(k)), 'bx') ;
end
set(gca,'xtick',[],'ytick',[]) ;
end
end