spm_unvec.m 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. function [varargout] = spm_unvec(vX,varargin)
  2. % Unvectorise a vectorised array - a compiled routine
  3. % FORMAT [varargout] = spm_unvec(vX,varargin)
  4. % varargin - numeric, cell or structure array
  5. % vX - spm_vec(X)
  6. %
  7. % i.e. X = spm_unvec(spm_vec(X),X)
  8. % [X1,X2,...] = spm_unvec(spm_vec(X1,X2,...),X1,X2,...)
  9. %
  10. % See spm_vec
  11. %__________________________________________________________________________
  12. % Copyright (C) 2005-2014 Wellcome Trust Centre for Neuroimaging
  13. % Karl Friston
  14. % $Id: spm_unvec.m 6238 2014-10-13 09:38:23Z karl $
  15. %error('spm_unvec.c not compiled - see Makefile')
  16. % deal to multiple outputs if necessary
  17. %--------------------------------------------------------------------------
  18. if nargout > 1
  19. varargout = spm_unvec(vX,varargin);
  20. return
  21. end
  22. if numel(varargin) == 1
  23. X = varargin{1};
  24. else
  25. X = varargin;
  26. end
  27. % check vX is numeric
  28. %--------------------------------------------------------------------------
  29. if ~(isnumeric(vX) || islogical(vX))
  30. vX = spm_vec(vX);
  31. end
  32. % reshape numerical arrays
  33. %--------------------------------------------------------------------------
  34. if isnumeric(X) || islogical(X)
  35. if ndims(X) > 2
  36. X(:) = full(vX);
  37. else
  38. X(:) = vX;
  39. end
  40. varargout = {X};
  41. return
  42. end
  43. % fill in structure arrays
  44. %--------------------------------------------------------------------------
  45. if isstruct(X)
  46. f = fieldnames(X);
  47. for i = 1:numel(f)
  48. c = {X.(f{i})};
  49. if isnumeric(c)
  50. n = numel(c);
  51. else
  52. n = spm_length(c);
  53. end
  54. c = spm_unvec(vX(1:n),c);
  55. [X.(f{i})] = deal(c{:});
  56. vX = vX(n + 1:end);
  57. end
  58. varargout = {X};
  59. return
  60. end
  61. % fill in cell arrays
  62. %--------------------------------------------------------------------------
  63. if iscell(X)
  64. for i = 1:numel(X)
  65. if isnumeric(X{i})
  66. n = numel(X{i});
  67. else
  68. n = spm_length(X{i});
  69. end
  70. X{i} = spm_unvec(vX(1:n),X{i});
  71. vX = vX(n + 1:end);
  72. end
  73. varargout = {X};
  74. return
  75. end
  76. % else
  77. %--------------------------------------------------------------------------
  78. X = [];
  79. varargout = {X};