123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- function [z,w] = spm_DEM_z(M,N)
- % creates hierarchical innovations for generating data
- % FORMAT [z w] = spm_DEM_z(M,N)
- % M - model structure
- % N - length of data sequence
- %
- % z{i} - innovations for level i (N.B. z{end} corresponds to causes)
- % w{i} - innovations for level i (state noise)
- %
- % If there is no fixed or hyper parameterized precision, then unit noise is
- % created. It is assumed that this will be later modulated by state
- % dependent terms, specified by M.ph and M.pg in spm_DEM_int
- %__________________________________________________________________________
- % Copyright (C) 2008 Wellcome Trust Centre for Neuroimaging
- % Karl Friston
- % $Id: spm_DEM_z.m 5047 2012-11-09 20:48:20Z karl $
- % temporal convolution matrix (with unit variance)
- %--------------------------------------------------------------------------
- s = M(1).E.s + exp(-16);
- dt = M(1).E.dt;
- t = ((1:N) - 1)*dt;
- K = toeplitz(exp(-t.^2/(2*s^2)));
- K = diag(1./sqrt(diag(K*K')))*K;
- % create innovations z{i} and w{i}
- %--------------------------------------------------------------------------
- for i = 1:length(M)
-
- % precision of causes
- %======================================================================
- P = M(i).V;
-
- % plus prior expectations
- %----------------------------------------------------------------------
- try
- for j = 1:length(M(i).Q)
- P = P + M(i).Q{j}*exp(M(i).hE(j));
- end
- end
-
- % create causes: assume i.i.d. if precision is zero
- %----------------------------------------------------------------------
- if norm(P,1) == 0;
- z{i} = randn(M(i).l,N)*K;
- elseif norm(P,1) >= exp(16)
- z{i} = sparse(M(i).l,N);
- else
- z{i} = spm_sqrtm(inv(P))*randn(M(i).l,N)*K;
- end
-
- % precision of states
- %======================================================================
- P = M(i).W;
-
- % plus prior expectations
- %----------------------------------------------------------------------
- try
- for j = 1:length(M(i).R)
- P = P + M(i).R{j}*exp(M(i).gE(j));
- end
- end
-
- % create states: assume i.i.d. if precision (P) is zero
- %----------------------------------------------------------------------
- if ~isempty(P)
- if norm(P,1) == 0;
- w{i} = randn(M(i).n,N)*K*dt;
- elseif norm(P,1) >= exp(16)
- w{i} = sparse(M(i).n,N);
- else
- w{i} = spm_sqrtm(inv(P))*randn(M(i).n,N)*K*dt;
- end
- else
- w{i} = sparse(0,0);
- end
-
- end
|