-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspm_vb_init_volume.m
66 lines (56 loc) · 1.67 KB
/
spm_vb_init_volume.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
function [slice] = spm_vb_init_volume(X,p)
% Initialise generic aspects of slice structure for VB-GLM-AR models
% FORMAT [slice] = spm_vb_init_volume(X,p)
%
% X - design matrix
% p - AR model order
%
% slice - data structure (see spm_vb_glmar)
%__________________________________________________________________________
% Copyright (C) 2005-2014 Wellcome Trust Centre for Neuroimaging
% Will Penny and Nelson Trujillo-Barreto
% $Id: spm_vb_init_volume.m 6079 2014-06-30 18:25:37Z spm $
% disp('Initialising volume');
% disp(' ');
slice.X = X;
slice.p = p;
slice.k = size(X,2);
T = size(X,1);
slice.T = T;
slice.XT = X';
slice.XTX = slice.XT*X;
for t=p+1:T
slice.dX(:,:,t-p) = X(t-1:-1:t-p,:);
end
[ux,dx,vx] = svd(X);
if size(dx,2) > 1
ddx=diag(dx);
else
% design matrix with a single column
ddx = dx;
end
svd_tol = max(ddx)*eps*slice.k;
rank_X = sum(ddx > svd_tol);
ddxm = diag(ones(rank_X,1)./ddx(1:rank_X));
ddxm2 = diag(ones(rank_X,1)./(ddx(1:rank_X).^2));
slice.Xp = vx(:,1:rank_X)*ddxm*ux(:,1:rank_X)';
slice.X2 = vx(:,1:rank_X)*ddxm2*vx(:,1:rank_X)';
k = slice.k;
% Get lagged input covariances for updates
slice.I.Gx = slice.X(p+1:T,:)'*slice.X(p+1:T,:);
slice.I.xtx = slice.X(p+1:T,:)'*slice.X(p+1:T,:);
for ki=1:k
for kj=1:k
dXki = squeeze(slice.dX(:,ki,:));
dXkj = squeeze(slice.dX(:,kj,:));
if slice.p==1
% singleton dimension already transposed
dXki = dXki';
dXkj = dXkj';
end
Stmp = dXki*dXkj';
slice.I.S((kj-1)*k+ki,:) = Stmp(:)';
R1tmp = dXkj*slice.X(p+1:T,ki);
slice.I.R1((kj-1)*k+ki,:) = R1tmp';
end
end