-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCNet.m
111 lines (72 loc) · 3.01 KB
/
CNet.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
classdef CNet < handle
properties
Num_nodes = 0;
Dim = 0;
Noise_std = 0;
Range = 0;
Loc_gt = [];
Avg_Bias = 0;
Max_Bias = 0;
Index_anchor = [];
Loc_anchor = [];
M = [];
Loc_cp = [];
end
methods
function obj = CNet(Num_nodes, Dim)
obj.Num_nodes = Num_nodes;
obj.Dim = Dim;
obj.M = zeros(Num_nodes);
obj.Loc_cp = zeros(Num_nodes, Dim);
end
function Reset(obj, Num_nodes, Dim)
obj.Num_nodes = Num_nodes;
obj.Dim = Dim;
obj.Noise_std = 0;
obj.Range = 0;
obj.Loc_gt = [];
obj.Avg_Bias = 0;
obj.Max_Bias = 0;
obj.Index_anchor = [];
obj.Loc_anchor = [];
obj.M = zeros(Num_nodes);
obj.Loc_cp = zeros(Num_nodes, Dim);
end
function [iter, time] = Simulate(obj, Noise_std, Range)
obj.Noise_std = Noise_std;
obj.Range = Range;
obj.Loc_gt = obj.Range .* rand(obj.Num_nodes, obj.Dim);
if obj.Dim == 2
obj.Loc_gt(1:4, :) = [obj.Range, 0; obj.Range, obj.Range; 0, 0; 0, obj.Range];
elseif obj.Dim == 3
obj.Loc_gt(1:4, :) = [obj.Range, 0, 0; 0, obj.Range, 0; 0, 0, obj.Range; 0, 0, 0];
end
obj.Index_anchor = 1:4;
obj.Loc_anchor = obj.Loc_gt(1:4, :);
Cor_square = sum(obj.Loc_gt .^ 2, 2);
M_gt = (-2 .* (obj.Loc_gt * obj.Loc_gt.') + Cor_square) + Cor_square.';
M_gt(M_gt < 0) = 0;
M_gt = sqrt(M_gt);
noise = obj.Noise_std .* sqrt(2) .* randn(obj.Num_nodes, obj.Num_nodes);
noise = ((noise + noise.') ./ 2) .* (1 - eye(obj.Num_nodes));
obj.M = M_gt + noise;
[iter, time] = obj.Localize();
bias = sqrt(sum((obj.Loc_cp - obj.Loc_gt) .^ 2, 2));
obj.Max_Bias = max(bias);
obj.Avg_Bias = sum(bias) ./ obj.Num_nodes;
end
function [iter, time] = Localize(obj)
if obj.Dim == 2
t = tic;
[Loc, iter] = dhy_MDS_Adam_2D(obj.M, 1e-5);
obj.Loc_cp = dhy_Ctrans_ICP(Loc, obj.Loc_anchor, obj.Index_anchor);
time = toc(t);
elseif obj.Dim == 3
t = tic;
[Loc, iter] = dhy_MDS_Adam_3D(obj.M, 1e-5);
obj.Loc_cp = dhy_Ctrans_ICP(Loc, obj.Loc_anchor, obj.Index_anchor);
time = toc(t);
end
end
end
end