-
Notifications
You must be signed in to change notification settings - Fork 0
/
AnchorNetTensor.m
89 lines (81 loc) · 2.08 KB
/
AnchorNetTensor.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
function [ Xref ] = AnchorNetTensor( X, p, choice, ver )
% Given point set X and approximation level p >= 0,
% generate Q anchor points Xref
% INPUT:
% X: n-by-d matrix
% p: approximation level 0,1,2,...
% choice: type of anchors
% OUTPUT:
% Xref: anchor net pts (Q-by-d)
[n,d] = size(X);
Xmin = min(X); Xmax = max(X);
hX = Xmax-Xmin; % hX(k) = 0 is unlikely to be true
[ mpd, Q ] = pforX( hX, p );
pmod = p;
if ver == 1
Qm = max(round(n),5e3);
else
Qm = max(round(n/2),1e4);
end
while Q > Qm & n > 1e3 & d > 3
pmod = pmod - 1;
[ mpd, Q ] = pforX( hX, pmod );
end
% Xrefd{i}=anchor pts in the i^th dimension
Xrefd = cell(1,d);
if min(mpd) == 0
Xrefd(mpd==0) = num2cell( (Xmin(mpd==0)+Xmax(mpd==0))/2 );
end
ind = 1:d;
ind = ind(mpd>0);
%@@@@ choice=1,2,3...: anchors pts types
% larger choice -> more near the boundary
switch choice
case 'U'
for k = ind
hk = hX(k)/mpd(k);
Xrefd{k} = Xmin(k)+hk*(0:mpd(k))';
end
case 'C'
for k = ind
Xrefd{k} = (Xmin(k)+Xmax(k))/2+(Xmax(k)-Xmin(k))/2*cos( (2*(0:mpd(k))'+1)*pi/(2*mpd(k)+2) );
end
case 1
for k = ind
hk = hX(k)/(mpd(k)+1);
Xrefd{k} = Xmin(k)+hk/2+hk*(0:mpd(k))'; % column vector !
end
case 2
for k = ind
hk = hX(k)/(mpd(k)+2/3);
Xrefd{k} = Xmin(k)+1/3*hk+hk*(0:mpd(k))';
end
case 3
for k = ind
hk = hX(k)/(mpd(k)+1/2);
Xrefd{k} = Xmin(k)+1/4*hk+hk*(0:mpd(k))';
end
case 4
for k = ind
hk = hX(k)/(mpd(k)+2/5);
Xrefd{k} = Xmin(k)+1/5*hk+hk*(0:mpd(k))';
end
case 5
for k = ind
hk = 0.85*hX(k)/mpd(k);
Xrefd{k} = Xmin(k)+0.1*hk+hk*(0:mpd(k))';
end
end
% ready to build
Xref = zeros(Q,d);
if min(mpd) == 0
tmp = cell2mat(Xrefd(mpd==0));
Xref(:,mpd==0) = repmat(tmp,Q,1);
end
ind = 1:d;
ind = ind(mpd>0);
tk = Q;
for k = ind
tk = tk/(1+mpd(k));
Xref(:,k) = kron( ones(Q/(tk*(mpd(k)+1)),1), kron(Xrefd{k},ones(tk,1)) );
end