-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspm_vb_get_Gn.m
43 lines (36 loc) · 1.37 KB
/
spm_vb_get_Gn.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
function [G,G1,G2,G3] = spm_vb_get_Gn(Y,slice,n)
% Compute Gn for VB-GLM-AR modelling
% FORMAT [G,G1,G2,G3] = spm_vb_get_Gn(Y,slice,n)
%
% Y - [T x N] time series
% slice - data structure (see spm_vb_glmar)
% n - voxel number
%__________________________________________________________________________
% Copyright (C) 2005-2014 Wellcome Trust Centre for Neuroimaging
% Will Penny and Nelson Trujillo-Barreto
% $Id: spm_vb_get_Gn.m 6079 2014-06-30 18:25:37Z spm $
p = slice.p;
k = slice.k;
a_mean_t = slice.ap_mean(:,n);
a_mean = a_mean_t';
block_n = [(n-1)*k+1:n*k];
w_mean = slice.w_mean(block_n,1);
w2 = slice.w2{n};
a2 = slice.a2{n};
% Equations 77 to 81 of paper VB1 but implemented
% efficiently using cross-covariance method described in paper VB3
G11 = slice.y2(n);
G12 = ones(1,p)*(a2.*slice.I.Gy(:,:,n))*ones(p,1);
G13 = -2*slice.I.gy(:,n)'*a_mean_t;
G1 = G11 + G12 + G13;
G21 = ones(1,k)*(w2.*slice.I.Gx)*ones(k,1);
G22 = trace(slice.I.A2_tilde(:,:,n)*slice.w_cov{n});
G23 = ones(1,k)*((w_mean*w_mean').*slice.I.A2_tilde(:,:,n))*ones(k,1);
G24 = 2*ones(1,k)*(w2.*slice.I.A3a_tilde(:,:,n))*ones(k,1);
G2 = G21 + G22 + G23 + G24;
G31 = -2*w_mean'*slice.I.gxy(:,n);
G32 = 2*a_mean*slice.I.rxy(:,:,n)*w_mean;
G33 = 2*a_mean*slice.I.Gxy(:,:,n)*w_mean;
G34 = -2*ones(1,p)*(a2.*slice.I.W_tilde(:,:,n))*ones(p,1);
G3 = G31 + G32 + G33 + G34;
G = G1 + G2 +G3;