| function this = subsasgn(this, subs, A) |
| |
| |
| |
|
|
| |
| |
|
|
| 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 |
| |
| [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 |
| |
| this.data{n}.metadata = struct([]); |
| this.data{n}.space = []; |
| this.data{n}.attributes.Dim = size(A); |
| |
| 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 |
| |
| |
| case 'private' |
| this = builtin('subsasgn',this,subs(2:end),A); |
| |
| |
| |
| 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 |
| |
| |
| |
| 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 |
| |
| |
| |
| 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 |
| |
| |
| |
| 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 |
|
|