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