cindyhfls's picture
Upload 155 files
0b58803 verified
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