spm_DEM_embed.m 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. function [y] = spm_DEM_embed(Y,n,t,dt,d)
  2. % temporal embedding into derivatives
  3. % FORMAT [y] = spm_DEM_embed(Y,n,t,dt,d)
  4. %__________________________________________________________________________
  5. % Y - (v x N) matrix of v time-series of length N
  6. % n - order of temporal embedding
  7. % t - time {bins} at which to evaluate derivatives (starting at t = 1)
  8. % dt - sampling interval {secs} [default = 1]
  9. % d - delay (bins) for each row of Y
  10. %
  11. % y - {n,1}(v x 1) temporal derivatives y[:] <- E*Y(t)
  12. %==========================================================================
  13. % Copyright (C) 2008 Wellcome Trust Centre for Neuroimaging
  14. % Karl Friston
  15. % $Id: spm_DEM_embed.m 4663 2012-02-27 11:56:23Z karl $
  16. % defaults
  17. %--------------------------------------------------------------------------
  18. if nargin < 4, dt = 1; end
  19. if nargin < 5, d = 0; end
  20. % get dimensions
  21. %--------------------------------------------------------------------------
  22. [q N] = size(Y);
  23. y = cell(n,1);
  24. [y{:}] = deal(sparse(q,1));
  25. % return if ~q
  26. %--------------------------------------------------------------------------
  27. if ~q, return, end
  28. % loop over channels
  29. %--------------------------------------------------------------------------
  30. for p = 1:length(d)
  31. % boundary conditions
  32. %----------------------------------------------------------------------
  33. s = (t - d(p))/dt;
  34. k = (1:n) + fix(s - (n + 1)/2);
  35. x = s - min(k) + 1;
  36. i = k < 1;
  37. k = k.*~i + i;
  38. i = k > N;
  39. k = k.*~i + i*N;
  40. % Inverse embedding operator (T): cf, Taylor expansion Y(t) <- T*y[:]
  41. %----------------------------------------------------------------------
  42. for i = 1:n
  43. for j = 1:n
  44. T(i,j) = ((i - x)*dt)^(j - 1)/prod(1:(j - 1));
  45. end
  46. end
  47. % embedding operator: y[:] <- E*Y(t)
  48. %----------------------------------------------------------------------
  49. E = inv(T);
  50. % embed
  51. %----------------------------------------------------------------------
  52. if length(d) == q
  53. for i = 1:n
  54. y{i}(p,:) = Y(p,k)*E(i,:)';
  55. end
  56. else
  57. for i = 1:n
  58. y{i} = Y(:,k)*E(i,:)';
  59. end
  60. return
  61. end
  62. end