0001 function [slice] = spm_vb_w (Y,slice)
0002
0003
0004
0005
0006
0007
0008
0009
0010 if slice.verbose
0011 disp('Updating w');
0012 end
0013
0014 X = slice.X;
0015 T = slice.T;
0016 p = slice.p;
0017 N = slice.N;
0018 k = slice.k;
0019 Bk = kron(diag(slice.mean_alpha),slice.D);
0020 B = slice.Hw*Bk*slice.Hw';
0021
0022 if p > 0
0023 voxel=spm_vb_get_Ab (Y,slice);
0024 end
0025
0026 for n=1:N,
0027 block_n = [(n-1)*k+1:n*k];
0028 block_ni = [1:N*k];
0029 block_ni(block_n) = [];
0030 Bnn = B(block_n,block_n);
0031 Bni = B(block_n,block_ni);
0032
0033 if p > 0
0034 slice.w_cov{n} = inv(slice.mean_lambda(n)*voxel(n).A + Bnn);
0035 w_mean = slice.w_cov{n} * (slice.mean_lambda(n)*voxel(n).b-Bni*slice.w_mean(block_ni,1));
0036 else
0037 slice.w_cov{n} = inv(slice.mean_lambda(n)*slice.XTX + Bnn);
0038 w_mean = slice.w_cov{n} * (slice.mean_lambda(n)*slice.XTY(:,n)-Bni*slice.w_mean(block_ni,1));
0039 end
0040 slice.w_mean(block_n,1)=w_mean;
0041 slice.w2{n}=w_mean*w_mean'+slice.w_cov{n};
0042
0043
0044 if p>0
0045 slice.I.W_tilde(:,:,n)=reshape(slice.I.D(:,:,n)'*w_mean,p,p);
0046 end
0047 end
0048