|
|
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 |
|
|
|