0001 function [slice] = spm_vb_a (Y,slice)
0002
0003
0004
0005
0006
0007
0008
0009
0010 if slice.verbose
0011 disp('Updating a');
0012 end
0013
0014 p=slice.p;
0015 k=slice.k;
0016 N=slice.N;
0017 T=slice.T;
0018 Jk = kron(diag(slice.mean_beta),slice.D);
0019 J=slice.Ha*Jk*slice.Ha';
0020
0021 Y_err_w = Y(p+1:T,:) - slice.X(p+1:T,:)*reshape(slice.w_mean,k,N);
0022
0023 for n=1:N,
0024
0025
0026 wblock_n = [(n-1)*k+1:n*k];
0027 block_n = [(n-1)*p+1:n*p];
0028 block_ni = [1:N*p];
0029 block_ni(block_n) = [];
0030 Jnn = J(block_n,block_n);
0031 Jni = J(block_n,block_ni);
0032
0033 w_mean=slice.w_mean(wblock_n);
0034
0035
0036
0037
0038 C1=slice.I.Gy(:,:,n);
0039 C2=reshape(slice.I.S'*slice.w2{n}(:),p,p);
0040 C3=-slice.I.W_tilde(:,:,n);
0041 C4=C3';
0042 C_til=C1+C2+C3+C4;
0043
0044 D1=slice.I.gy(:,n)';
0045 D2=(-slice.I.rxy(:,:,n)*w_mean)';
0046 D3=(-slice.I.Gxy(:,:,n)*w_mean)';
0047 D4=slice.w2{n}(:)'*slice.I.R1;
0048 D_til=D1+D2+D3+D4;
0049
0050
0051 slice.a_cov{n} = inv(slice.mean_lambda(n)*C_til + Jnn);
0052 a_mean = slice.a_cov{n}*(slice.mean_lambda(n)*D_til'-Jni*slice.a_mean(block_ni,1));
0053 slice.a_mean(block_n,1)=a_mean;
0054 slice.a2{n}=a_mean*a_mean'+slice.a_cov{n};
0055
0056
0057
0058 slice.I.A2_tilde(:,:,n)=reshape(slice.I.S*slice.a2{n}(:),k,k);
0059 slice.I.A3a_tilde(:,:,n)=-reshape(slice.I.R1*a_mean,k,k);
0060 end
0061
0062 slice.ap_mean = reshape(slice.a_mean,p,N);
0063