123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- function this = subsasgn(this, subs, A)
- % Subscript assignment for GIfTI objects
- %__________________________________________________________________________
- % Copyright (C) 2008 Wellcome Trust Centre for Neuroimaging
- % Guillaume Flandin
- % $Id: subsasgn.m 6513 2015-08-05 17:52:13Z guillaume $
- switch subs(1).type
- case '.'
- if ~ismember(subs(1).subs, ...
- {'vertices' 'faces' 'normals' 'cdata','mat','indices','private'})
- error('Reference to non-existent field ''%s''.',subs(1).subs);
- end
- % TODO % handle cases when length(subs) > 1
- [i,n] = isintent(this,subs(1).subs);
- if isempty(i) && ~strcmp(subs(1).subs,'private')
- n = length(this.data) + 1;
- if n==1, this.data = {}; end
- % TODO % Initialise data field appropriately
- this.data{n}.metadata = struct([]);
- this.data{n}.space = [];
- this.data{n}.attributes.Dim = size(A);
- % TODO % set DataType according to intent type
- this.data{n}.data = [];
- switch subs(1).subs
- case {'vertices','mat'}
- in = 'NIFTI_INTENT_POINTSET';
- dt = 'NIFTI_TYPE_FLOAT32';
- this.data{n}.space.DataSpace = 'NIFTI_XFORM_UNKNOWN';
- this.data{n}.space.TransformedSpace = 'NIFTI_XFORM_UNKNOWN';
- this.data{n}.space.MatrixData = eye(4);
- case 'faces'
- in = 'NIFTI_INTENT_TRIANGLE';
- dt = 'NIFTI_TYPE_INT32';
- case 'indices'
- in = 'NIFTI_INTENT_NODE_INDEX';
- dt = 'NIFTI_TYPE_INT32';
- case 'normals'
- in = 'NIFTI_INTENT_VECTOR';
- dt = 'NIFTI_TYPE_FLOAT32';
- case 'cdata'
- in = 'NIFTI_INTENT_NONE';
- dt = 'NIFTI_TYPE_FLOAT32';
- otherwise
- error('This should not happen.');
- end
- this.data{n}.attributes.Intent = in;
- this.data{n}.attributes.DataType = dt;
- end
-
- switch subs(1).subs
- %- .private
- %--------------------------------------------------------------
- case 'private'
- this = builtin('subsasgn',this,subs(2:end),A);
-
- % .mat
- %--------------------------------------------------------------
- case 'mat'
- if length(subs) > 1
- this.data{n}.space(1).MatrixData = builtin('subsasgn',...
- this.data{n}.space(1).MatrixData,subs(2:end),A);
- else
- if ~isequal(size(A),[4 4])
- error('Invalid Coordinate System Transform Matrix.');
- end
- this.data{n}.space(1).MatrixData = A;
- end
-
- %- .faces
- %--------------------------------------------------------------
- case 'faces'
- if length(subs) > 1
- this.data{n}.data = int32(builtin('subsasgn',this.data{n}.data,subs(2:end),A-1));
- else
- this.data{n}.data = int32(A - 1);
- this.data{n}.attributes.Dim = size(A);
- end
-
- %- .indices
- %--------------------------------------------------------------
- case 'indices'
- if n ~= 1
- this.data = this.data([n setdiff(1:numel(this.data),n)]);
- n = 1;
- end
- if length(subs) > 1
- this.data{n}.data = int32(builtin('subsasgn',this.data{n}.data,subs(2:end),A-1));
- else
- A = A(:);
- this.data{n}.data = int32(A - 1);
- this.data{n}.attributes.Dim = size(A);
- end
-
- %- .vertices, .normals, .cdata
- %--------------------------------------------------------------
- otherwise
- if length(subs) > 1
- if numel(n) == 1
- this.data{n}.data = single(builtin('subsasgn',this.data{n}.data,subs(2:end),A));
- this.data{n}.attributes.Dim = size(this.data{n}.data);
- else
- if numel(subs(2).subs) == 1
- error('Linear indexing not supported: use multiple subscripts.');
- end
- idx = subs(2).subs{2};
- if isequal(idx,':'), idx = 1:numel(this.data); end
- for k=1:numel(idx)
- s = subs(2);
- s.subs{2} = 1;
- if numel(A) == 1
- this.data{idx(k)}.data = single(builtin('subsasgn',this.data{idx(k)}.data,s,A));
- else
- this.data{idx(k)}.data = single(builtin('subsasgn',this.data{idx(k)}.data,s,A(:,k)));
- end
- this.data{idx(k)}.attributes.Dim = size(this.data{idx(k)}.data);
- end
- end
- else
- if numel(n) == 1
- if isa(A,'file_array')
- this.data{n}.data = A;
- this.data{n}.attributes.Dim = A.dim;
- else
- this.data{n}.data = single(A);
- this.data{n}.attributes.Dim = size(A);
- end
- else
- error('Syntax not implemented.');
- end
- end
- end
-
- case '()'
- case '{}'
- otherwise
- error('This should not happen.');
- end
|