12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- function Y = spm_data_read(V,varargin)
- % Read data from disk [Y = V(I)]
- % FORMAT Y = spm_data_read(V)
- % V - a structure array (see spm_data_hdr_read)
- % Y - an array of data values; the last dimension indexes numel(V)
- %
- % FORMAT Y = spm_data_read(V,'slice',S)
- % V - a structure array of image volumes (see spm_data_hdr_read)
- % S - an array of slice indices
- % Y - an array of data values with dimensions (x,y,s,v)
- %
- % FORMAT Y = spm_data_read(V,'xyz',XYZ)
- % V - a structure array (see spm_data_hdr_read)
- % XYZ - a [n x m] array of m coordinates {voxel (n=3 or 4)/vertex (n=1)}
- % Y - an array of data values with dimensions (v,m)
- %
- % FORMAT Y = spm_data_read(V,I1,I2,...)
- % V - a structure array (see spm_data_hdr_read)
- % I1,I2,...- subscript arrays
- % Y - an array of data values with dimensions (v,m)
- %__________________________________________________________________________
- % Copyright (C) 2012 Wellcome Trust Centre for Neuroimaging
- % Guillaume Flandin
- % $Id: spm_data_read.m 6486 2015-06-24 16:27:17Z guillaume $
- if ~isstruct(V)
- V = spm_data_hdr_read(V);
- end
- cl = class(V(1).private);
- if isfield(V(1),'dat') && ~isequal(cl,'gifti'), cl = 'nifti'; end
- switch cl
- case 'nifti'
- if isempty(varargin)
- % Y = V.private.dat(); % if numel(V)==1, is faster
- Y = spm_read_vols(V);
- elseif ischar(varargin{1}) && ~isequal(varargin{1},':')
- switch lower(varargin{1})
- case 'slice'
- for i=1:numel(V), for p=1:numel(varargin{2})
- Y(:,:,p,i) = spm_slice_vol(V(i),spm_matrix([0 0 varargin{2}(p)]),V(i).dim(1:2),0);
- end, end
- if numel(V)==1, Y=Y(:,:,:,1); end
- case 'xyz'
- Y = spm_get_data(V,varargin{2});
- otherwise
- error('Unknown input option.');
- end
- else
- indices = varargin;
- n = get_ndata(V(1).dim,indices{:});
- Y = zeros(numel(V),prod(n));
- for i=1:numel(V)
- if numel(indices) == 1
- ind = {indices{1} + (V(i).n(1)-1)*prod(V(i).dim)};
- else
- ind = indices;
- end
- Y(i,:) = reshape(V(i).private.dat(ind{:}),1,[]);
- end
- end
-
- case 'gifti'
- indices = varargin;
- if isempty(indices)
- indices = repmat({':'},1,ndims(V));
- elseif strcmpi(indices{1},'xyz')
- indices = {indices{2}(1,:)};
- end
- n = get_ndata(V(1).dim,indices{:});
- Y = zeros(numel(V),prod(n));
- for i=1:numel(V)
- Y(i,:) = reshape(V(i).private.cdata(indices{:}),1,[]);
- end
- if isempty(varargin), Y = Y'; end % to be coherent with spm_read_vols
-
- otherwise
- error('Unknown data type.');
- end
- %==========================================================================
- function n = get_ndata(dim,varargin)
- n = zeros(1,numel(varargin));
- for i=1:numel(varargin)
- if isequal(varargin{i},':')
- if i==numel(varargin)
- n(i) = dim(i); %prod(dim(i:end));
- else
- n(i) = dim(i);
- end
- else
- n(i) = numel(varargin{i});
- end
- end
|