-
Notifications
You must be signed in to change notification settings - Fork 1
/
gemdbht.m
92 lines (37 loc) · 1.05 KB
/
gemdbht.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
function [grad] = gemdbht(A,K,S,m,para,Obs,Kc)
% this calculate gradient step of objective function for MKC_emdb(ht) with respect to A^{(m)}
% Output :
% grad : (\partial f / \partial A^{(m)})
grad=zeros(size(A,1),size(A,2));
eps=1E-10;
M=size(K,3);
N=size(K,2);
for l =1:1:M
temp(l).T=zeros(size(A,1),size(A,2));
for l2=1:1:M
if l2==l
else
temp(l).T=S(l,l2)*A(:,:,l2);
end
end
temp(l).D=A(:,Obs(l).id,l)*K(Obs(l).id,Obs(l).id,l);
temp(l).hatk=temp(l).D*A(:,Obs(l).id,l)';
temp(l).B=K(Obs(l).id,Obs(l).id,l)-temp(l).hatk(Obs(l).id,Obs(l).id);
temp(l).E=temp(l).B*temp(l).D(Obs(l).id,:);
temp(l).C=A(:,:,l)-temp(l).T;
end
Part1=zeros(N,N);
Part1=-temp(m).E;
grad(Obs(m).id,Obs(m).id)= grad(Obs(m).id,Obs(m).id) +4*para.c1*Part1/(M*length(Obs(m).id)^2);
part= zeros(size(A,1),size(A,2));
for l =1:1:M
if l==m
part=part+temp(m).C;
else
part=part-S(l,m)*temp(l).C;
end
end
grad= grad + 2*para.c2*part/(M*N);
clear temp part Part1;
return;
end