Source MatLab: http://ecco2.jpl.nasa.gov/data1/matlab/netcdf_toolbox/netcdf/@ncvar/resize.m
No Format |
---|
function theResult = resize(self, newSize) % ncvar/resize - Resize variable dimensions. % resize(self, newSize) resizes the dimensions of self, % an "ncvar" object. All variables related to the % changed dimensions are similarly affected. The % newSize must have the same number of dimensions % as the existing variable. The new self is returned. % Copyright (C) 1998 Dr. Charles R. Denham, ZYDECO. % All Rights Reserved. % Disclosure without explicit written consent from the % copyright owner does not constitute publication. % Version of 03-Nov-1998 08:52:22. % Updated 12-Aug-1999 09:42:01. if nargin < 1, help(mfilename), return, end if nargout > 0, theResult = self; end % Check for no-change. if isequal(ncsize(self), newSize) result = self; if nargout > 0 theResult = result; else ncans(result) end return end theItemName = name(self); % Check for writeability. f = parent(self); thePermission = permission(f); theSrcName = name(f); if isequal(thePermission, 'nowrite') disp([' ## NetCDF source file must be writeable.']) return end % Check request. d = dim(self); for i = 1:length(d) if \~isrecdim(d[i]) & newSize(i) <= 0 disp(\[' ## Dimension "' name(d[i]) '" size requires positive integer.'\]) return end end % Create temporary file. g = \[\]; i = 0; while isempty(g) i = i + 1; theTmpName = ['tmp_' int2str(i) '.nc'|'tmp_' int2str(i) '.nc']; if exist(theTmpName, 'file') \~= 2 g = netcdf(theTmpName, 'noclobber'); end end theTmpName = name(g); % Copy affected dimensions first. d = dim(self); for i = 1:length(d) if isrecdim(d[i]) g(name(d[i])) = 0; elseif newSize(i) <= 0 error(\[' ## Dimension "' name(d[i]) '" requires positive integer.'\]) else g(name(d[i])) = newSize(i) ; end end % Copy other dimensions. d = dim(f); for i = 1:length(d) g(name(d[i])) = ncsize(d[i]); end % Copy global attributes. a = att(f); for i = 1:length(a) copy(a[i], g) end % Copy variable definitions and attributes. v = var(f); for i = 1:length(v) copy(v[i], g, 0, 1) end % Copy variable data as minimal rectangular array. % Note that the "()" operator is out-of-context % inside this method, so we have to build our own % calls to "ncvar/subsref" and "ncvar/subsasgn". % It might be easier for us to use "virtual" % variables instead, which could be transferred % with the more intelligent "ncvar/copy" method. v = var(f); w = var(g); for i = 1:length(v) sv = ncsize(v[i]); sw = ncsize(w[i]); if \~isempty(sw) d = dim(w[i]); if isrecdim(d[1]) if sw(1) == 0 if isequal(name(d[1]), theItemName) sw(1) = newSize; else sw(1) = sv(1); end end end end theMinimalSize = min(sv, sw); if prod(theMinimalSize) > 0 if isequal(sv, sw) copy(v[i], g, 1) else theIndices = cell(size(theMinimalSize)); for j = 1:length(theIndices) theIndices[j] = 1:theMinimalSize(j); end theStruct.type = '()'; theStruct.subs = theIndices; theData = subsref(v[i], theStruct); w[i] = subsasgn(w[i], theStruct, theData); end end end % Close both files. f = close(f); g = close(g); {color:#ff0000}% Delete old file.{color} {color:#ff0000}delete(theSrcName){color} {color:#ff0000}% Rename new file to old file name.{color} {color:#ff0000}fcopy(theTmpName, theSrcName){color} {color:#ff0000}delete(theTmpName){color} {color:#ff0000}% Open the new file.{color} {color:#ff0000}g = netcdf(theSrcName, thePermission);{color} % Return the resized variable. result = g[theItemName]; if nargout > 0 theResult = result; else ncans(result) end |