time | Calls | line |
---|
| | 1 | function s = rmfield(s,field)
|
| | 2 | %RMFIELD Remove fields from a structure array.
|
| | 3 | % S = RMFIELD(S,FIELD) removes the field specified by FIELD from the
|
| | 4 | % m x n structure array S. For example, S = RMFIELD(S,'a') removes the field
|
| | 5 | % 'a' from S. The size of input S is preserved.
|
| | 6 | %
|
| | 7 | % S = RMFIELD(S,FIELDS) removes more than one field at a time when FIELDS
|
| | 8 | % is a string, character array or cell array of character vectors. The
|
| | 9 | % changed structure is returned. The size of input S is preserved.
|
| | 10 | %
|
| | 11 | % See also SETFIELD, GETFIELD, ISFIELD, FIELDNAMES.
|
| | 12 |
|
| | 13 | % Copyright 1984-2017 The MathWorks, Inc.
|
| | 14 |
|
| | 15 | %--------------------------------------------------------------------------------------------
|
| | 16 | % handle input arguments
|
| | 17 |
|
| | 18 |
|
< 0.001 | 2 | 19 | if ~isa(s,'struct')
|
| | 20 | error(message('MATLAB:rmfield:Arg1NotStructArray'));
|
| | 21 | end
|
| | 22 |
|
< 0.001 | 2 | 23 | field = convertStringsToChars(field);
|
| | 24 |
|
< 0.001 | 2 | 25 | if iscell(field) && isempty(field)
|
| | 26 | % No fields to remove
|
| | 27 | return
|
| | 28 | end
|
| | 29 |
|
< 0.001 | 2 | 30 | if ~ischar(field) && ~iscellstr(field)
|
| | 31 | error(message('MATLAB:rmfield:FieldnamesNotStrings'));
|
| | 32 | end
|
| | 33 |
|
< 0.001 | 2 | 34 | if ischar(field) && ~isrow(field)
|
| | 35 | % converts char matrix to cell-str but leave char vector alone
|
| | 36 | field = cellstr(field);
|
| | 37 | end
|
| | 38 |
|
| | 39 | % get fieldnames of struct
|
< 0.001 | 2 | 40 | f = fieldnames(s);
|
| | 41 | % Determine which fieldnames to delete.
|
< 0.001 | 2 | 42 | if ischar(field) || isscalar(field)
|
| | 43 | % shortcut for single field.
|
< 0.001 | 2 | 44 | nonexistent = [];
|
< 0.001 | 2 | 45 | toRemove = strcmp(deblank(field),f);
|
< 0.001 | 2 | 46 | if ~any(toRemove)
|
| | 47 | nonexistent = find(~toRemove,1);
|
| | 48 | end
|
| | 49 | elseif numel(f) < 100 && numel(field) < 10
|
| | 50 | % faster for small number of fields
|
| | 51 | [toRemove,nonexistent] = smallcase(f,field);
|
| | 52 | else
|
| | 53 | % faster for large number of fields.
|
| | 54 | [toRemove,nonexistent] = generalcase(f,field);
|
| | 55 | end
|
| | 56 |
|
| | 57 | % If any given fields were not found, throw an error
|
< 0.001 | 2 | 58 | if ~isempty(nonexistent)
|
| | 59 | field = cellstr(field);
|
| | 60 | name = field{nonexistent};
|
| | 61 | % Make sure the given non-existent field name does not exceed max length
|
| | 62 | if length(name) > namelengthmax
|
| | 63 | error(message('MATLAB:rmfield:FieldnameTooLong', name));
|
| | 64 | else
|
| | 65 | error(message('MATLAB:rmfield:InvalidFieldname', name));
|
| | 66 | end
|
| | 67 | end
|
| | 68 |
|
| | 69 | % convert struct to cell array
|
< 0.001 | 2 | 70 | c = struct2cell(s);
|
| | 71 |
|
| | 72 | % find size of cell array
|
< 0.001 | 2 | 73 | sz = size(c);
|
| | 74 |
|
| | 75 | % adjust size for fields to be removed
|
< 0.001 | 2 | 76 | sz(1) = sz(1) - nnz(toRemove);
|
| | 77 |
|
| | 78 | % rebuild struct
|
< 0.001 | 2 | 79 | s = cell2struct(reshape(c(~toRemove,:),sz),f(~toRemove));
|
| | 80 | %--------------------------------------------------------------------------------------------
|
< 0.001 | 2 | 81 | end
|
Other subfunctions in this file are not included in this listing.