📄 copy.m
字号:
function theResult = copy(self, theDestination, ...
copyData, copyAttributes, copyDimensions)
% ncvar/copy -- Copy a NetCDF variable, including data and attributes.
% copy(self, theDestination, copyData, copyAttributes) copies the NetCDF
% variable associated with self, an "ncvar" object, to the location
% associated with theDestination, a "netcdf" or "ncvar" object. If
% successful, the new "ncvar" object is returned; otherwise, the empty-
% matrix [] is returned. The default behavior is NOT to copy data and
% attributes, unless otherwise directed with non-zero "copyData" and/or
% "copyAttributes".
%
% To copy several variables without rewriting theDestination file
% unnecessarily, call this routine once for each variable, using
% copyData = 0 and copyAttributes = 1. Then call it again for the
% same variables, using copyData = 1 and copyAttributes = 0.
%
% Small computers may require limits on memory usage during copying.
% If copyData > 1, it specifies the maximum number of data elements to
% transfer per NetCDF call. For copyData = 1, the number is 16*1024
% elements. Use "inf" to transfer all the data in one call.
%
% copy(self, theDestination, copyData, copyAttributes, copyDimensions)
% for copyDimensions = 0 fulfills the copying request only if the
% corresponding dimensions already exist in theDestination NetCDF
% file. The default is copyDimensions = 1, which copies the
% corresponding dimensions automatically as needed.
% Copyright (C) 1997 Dr. Charles R. Denham, ZYDECO.
% All Rights Reserved.
% Disclosure without explicit written consent from the
% copyright owner does not constitute publication.
% Version of 14-May-1997 10:56:35.
% Revised 05-Sep-1997 22:42:02.
% Revised 24-Mar-1998 17:38:36. For Matlab 5.2.
% Arguments.
if nargin < 2, help(mfilename), return, end
if nargin < 3, copyData = 0; end
if nargin < 4, copyAttributes = 0; end
if nargin < 5, copyDimensions = 1; end
if nargout > 0, theResult = []; end
% Dimensions.
switch ncclass(theDestination)
case 'netcdf'
switch ncclass(self)
case 'ncvar'
if isempty(theDestination{name(self)})
d = dim(self);
for i = 1:length(d)
if ~copyDimensions
status = theDestination(name(d{i}));
else
status = (theDestination < d{i});
end
if isempty(status), return, end
end
end
otherwise
end
case 'ncvar'
otherwise
warning(' ## Incompatible arguments.')
end
% Variable definition.
switch ncclass(theDestination)
case 'netcdf'
switch ncclass(self)
case 'ncvar'
v = theDestination{name(self)};
if isempty(v)
v = ncvar(name(self), datatype(self), ncnames(dim(self)), theDestination);
if isempty(v), return, end
end
otherwise
end
case 'ncvar'
v = theDestination;
otherwise
warning(' ## Incompatible arguments.')
end
% Copy attributes.
if copyAttributes
switch ncclass(self)
case 'ncvar'
a = att(self);
for i = 1:length(a)
status = (v < a{i});
if isempty(status), return, end
end
otherwise
end
end
% Copy data.
MAX_CHUNK = 16 * 1024; % 16 K values = 128 K bytes.
if copyData > 1, MAX_CHUNK = copyData; end
if copyData
theClass = ncclass(self);
switch theClass
case {'ncvar', 'double', 'char', 'uint8'}
d = dim(v);
theSize = size(v);
if isempty(d)
kmax = 1;
elseif isrecdim(d{1})
theSize = ncsize(self);
kmax = prod(theSize);
else
kmax = min(prod(theSize), prod(size(self)));
end
[s, c] = ncind2sub(theSize, 1, min(MAX_CHUNK, kmax));
if length(c) > 0, MAX_CHUNK = c(1); end
k = 0;;
while k < kmax;
kstep = min(MAX_CHUNK, kmax-k);
[s, c] = ncind2sub(theSize, k+1, kstep);
[m, n] = size(s);
switch theClass
case 'ncvar'
for i = 1:m
t = s(i, :);
% v(t{:}) = self(t{:}); % "()" out-of-context here.
theSubs.type = '()';
theSubs.subs = t;
temp = subsref(self, theSubs);
v = subsasgn(v, theSubs, temp);
end
otherwise
for i = 1:m
t = s(i, :);
% v(t{:}) = self(k+1:k+kstep); % Here too.
theSubs.type = '()';
theSubs.subs = t;
temp = self(k+1:k+kstep);
v = subsasgn(v, theSubs, temp);
end
end
k = k + kstep;
end
otherwise
warning(' ## Incompatible arguments.')
end
end
% Return.
if nargout > 0, theResult = v; end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -