123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- function [x] = spm_cat(x,d)
- % Convert a cell array into a matrix - a compiled routine
- % FORMAT [x] = spm_cat(x,d)
- % x - cell array
- % d - dimension over which to concatenate [default - both]
- %__________________________________________________________________________
- % Empty array elements are replaced by sparse zero partitions and single 0
- % entries are expanded to conform to the non-empty non zero elements.
- %
- % e.g.:
- % > x = spm_cat({eye(2) []; 0 [1 1; 1 1]})
- % > full(x) =
- %
- % 1 0 0 0
- % 0 1 0 0
- % 0 0 1 1
- % 0 0 1 1
- %
- % If called with a dimension argument, a cell array is returned.
- %__________________________________________________________________________
- % Copyright (C) 2005-2013 Wellcome Trust Centre for Neuroimaging
- % Karl Friston
- % $Id: spm_cat.m 5731 2013-11-04 18:11:44Z guillaume $
- %error('spm_cat.c not compiled - see Makefile')
- % check x is not already a matrix
- %--------------------------------------------------------------------------
- if ~iscell(x), return, end
-
- % if concatenation over a specific dimension
- %--------------------------------------------------------------------------
- [n,m] = size(x);
- if nargin > 1
-
- % concatenate over first dimension
- %----------------------------------------------------------------------
- if d == 1
- y = cell(1,m);
- for i = 1:m
- y{i} = spm_cat(x(:,i));
- end
-
- % concatenate over second
- %----------------------------------------------------------------------
- elseif d == 2
-
- y = cell(n,1);
- for i = 1:n
- y{i} = spm_cat(x(i,:));
- end
-
- % only viable for 2-D arrays
- %----------------------------------------------------------------------
- else
- error('uknown option')
- end
- x = y;
- return
-
- end
-
- % find dimensions to fill in empty partitions
- %--------------------------------------------------------------------------
- for i = 1:n
- for j = 1:m
- if iscell(x{i,j})
- x{i,j} = spm_cat(x{i,j});
- end
- [u,v] = size(x{i,j});
- I(i,j) = u;
- J(i,j) = v;
- end
- end
- I = max(I,[],2);
- J = max(J,[],1);
-
- % sparse and empty partitions
- %--------------------------------------------------------------------------
- [n,m] = size(x);
- for i = 1:n
- for j = 1:m
- if isempty(x{i,j})
- x{i,j} = sparse(I(i),J(j));
- end
- end
- end
-
- % concatenate
- %--------------------------------------------------------------------------
- for i = 1:n
- y{i,1} = cat(2,x{i,:});
- end
- try
- x = sparse(cat(1,y{:}));
- catch
- x = cat(1,y{:});
- end
|