-
Notifications
You must be signed in to change notification settings - Fork 2
/
kd_closestpointfast.m
73 lines (60 loc) · 2.2 KB
/
kd_closestpointfast.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
function [index_vals,final_node] = kd_closestpointfast(tree,point,node_number)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% INPUTS
% tree --- the cell array that contains the tree
% point --- the point of interest
% none_number --- Internal Variable, Donot Define
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% OUTPUTS
% index_vals --- the index value in the original matrix that was used to
% build the tree
% final_node --- the node that contains the closest vector
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Donot define the node_number variable -- it is used for internal
% referencing
% Bharath Ramesh 26/2/2018
% Initialize the global variable
global tree_cell;
global safety_check;
if(nargin==2)
safety_check=0;
node_number=1;
tree_cell=tree;
final_node=node_number;
clear tree;
end
if (isempty(safety_check))
error ('Incorrect number of input variables ... please check ');
end
% if the current node is a leaf then output its results
if(strcmp(tree_cell(node_number).type,'leaf'))
index_vals=tree_cell(node_number).index;
final_node=node_number;
clear global tree_cell
clear global safety_check;
return;
end
% if the current node is not a leaf
% check to see if the point is to the left of the split dimension
% if it is to the left then recurse to the left
if (point(tree_cell(node_number).splitdim)<=tree_cell(node_number).splitval)
if (isempty(tree_cell(node_number).left))
% incase the left node is empty, then output current results
index_vals=tree_cell(node_number).index;
final_node=node_number;
return;
else
[index_vals,final_node]=kd_closestpointfast(0,point,tree_cell(node_number).left);
end
else
% as the point is to the right of the split dimension
% recurse to the right
if (isempty(tree_cell(node_number).right))
% incase the right node is empty, then output current results
index_vals=tree_cell(node_number).index;
final_node=node_number;
return;
else
[index_vals,final_node]=kd_closestpointfast(0,point,tree_cell(node_number).right);
end
end