Mercurial > hg > ltpda
diff m-toolbox/classes/+utils/@prog/rnfield.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/+utils/@prog/rnfield.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,71 @@ +function ss=rnfield(s,oldname,newname) +%RNFIELD Rename Structure Fields. +% RNFIELD(S,OldName,NewName) returns the structure S with the field name +% denoted by the string OldName changed to NewName. Oldname must exist in S. +% +% If OldName and NewName are cell arrays of strings of equal length, each +% field name in OldName is changed to the corresponding element in NewName. +% +% Examples: +% +% RNFIELD(S,fieldnames(S),lower(fieldnames(S))) makes all field names lower +% case as long as they are unique when lowercase +% +% If S.a=pi; S.b=inf; then +% RNFIELD(S,{'a' 'c'},{'c' 'd'}) produces S.d=pi; S.b=inf; +% +% See also ORDERFIELDS, RMFIELD, ISFIELD, FIELDNAMES. + +% D.C. Hanselman, University of Maine, Orono, ME 04469 +% MasteringMatlab@yahoo.com +% Mastering MATLAB 7 +% 2006-02-08, 2006-02-09 + +if nargin~=3 + error('rnfield:IncorrectNumberofInputArguments',... + 'Three Input Arguments Required.') +end +if ~isstruct(s) + error('rnfield:IncorrectInputArgument',... + 'First Argument Must be a Structure.') +end +if ~(ischar(oldname)||iscellstr(oldname)) &&... + ~(ischar(newname)||iscellstr(newname)) + error('rnfield:IncorrectInputArgument',... + 'Last Two Arguments Must be Strings or Cell Strings.') +end +if ischar(oldname) % convert to cell + oldname=cellstr(oldname); +end +if ischar(newname) % convert to cell + newname=cellstr(newname); +end +nold=length(oldname); +if nold~=length(newname) + error('rnfield:IncorrectInputArgument',... + 'OldName and NewName Must Have the Same Number of Elements.') +end + +fnames=fieldnames(s); % get field names of input structure + +for k=1:nold % do the work and perform error checking + if ~isequal(oldname{k},newname{k}) % no work if oldname==newname + if ~isvarname(newname{k}) + error('rnfield:NewFieldNameNotValid',... + 'Invalid New Field Variable Name: %s',newname{k}) + end + old=strcmp(fnames,oldname{k}); + if ~any(old) + error('rnfield:OldFieldNameDoesNotExist',... + 'Structure Does Not Contain the Field: %s',oldname{k}) + end + if any(strcmp(fnames,newname{k})) + error('rnfield:NewFieldNameAlreadyExists',... + 'Structure Already Contains the Field: %s',newname{k}) + end + fnames(old)=newname(k); % replace old field name with new one + end +end +ssize=size(s); +c=struct2cell(s); % convert structure to cell +ss=reshape(cell2struct(c,fnames,1),ssize); % rebuild with revised fields \ No newline at end of file