-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathFind_Rotation_and_Seed_unique.m
102 lines (92 loc) · 2.3 KB
/
Find_Rotation_and_Seed_unique.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
function [q2best,Rbest,gamIbest] = Find_Rotation_and_Seed_unique(q1,q2,reparamFlag,rotFlag,closed,lam,method)
% FIND_ROTATION_AND_SEED_UNIQUE find roation and seed of two curves
% -------------------------------------------------------------------------
% find roation and seed of closed curve
%
% Usage: [q2best,Rbest] = Find_Rotation_and_Seed_unique(q1,q2,reparamFlag)
%
%
% Input:
% q1: matrix (n,T) defining T points on n dimensional SRVF
% q2: matrix (n,T) defining T points on n dimensional SRVF
% reparamFlag: flag to calculate reparametrization (default F)
% closed: flag if closed curve (default F)
% lam: penalty (default 0.0)
% method: controls which optimization method (default="DP") options are
% Dynamic Programming ("DP") and Riemannian BFGS
% ("RBFGSM")
%
% Output:
% q2best: best aligned and rotated and seeded SRVF
% Rbest: best rotation matrix
% gamI: best reparameterization
if nargin < 3
reparamFlag = true;
rotFlag = true;
closed = false;
lam = 0.0;
method = 'DP';
elseif nargin < 4
rotFlag = true;
closed = false;
lam = 0.0;
method = 'DP';
elseif nargin < 5
closed = false;
lam = 0.0;
method = 'DP';
elseif nargin < 6
lam = 0.0;
method = 'DP';
elseif nargin < 7
method = 'DP';
end
[n,T] = size(q1);
scl = 4;
minE = 1000;
if closed
end_idx = floor((T)/scl);
else
end_idx = 0;
end
for ctr = 0:end_idx
if closed
q2n = ShiftF(q2,scl*ctr);
else
q2n = q2;
end
if (rotFlag)
[q2n,R] = Find_Best_Rotation(q1,q2n);
else
R = eye(n);
end
if(reparamFlag)
if norm(q1-q2n,'fro') > 0.0001
gam = optimum_reparam_curve(q2,q1,lam,method);
gamI = invertGamma(gam);
gamI = (gamI-gamI(1))/(gamI(end)-gamI(1));
p2n = q_to_curve(q2n);
p2new = warp_curve_gamma(p2n,gamI);
q2new = curve_to_q(p2new);
if closed
q2new = ProjectC(q2new);
end
else
q2new = q2n;
gamI = linspace(0,1,T);
end
else
q2new = q2n;
end
tmp = InnerProd_Q(q1,q2new);
if tmp > 1
tmp = 1;
end
Ec = acos(tmp);
if Ec < minE
Rbest = R;
q2best = q2new;
gamIbest = gamI;
minE = Ec;
end
end