1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
## Copyright (C) 2012 Alexander Barth <barth.alexander@gmail.com>
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; If not, see <http://www.gnu.org/licenses/>.
## -*- texinfo -*-
## @deftypefn {} {@var{x} =} ncsub(@var{A}, @var{idx})
## subsref function
## @end deftypefn
function x = subsref(self,idx)
assert(length(idx) == 1)
if strcmp(idx.type,'()')
% load data
if strcmp(idx.type,'()') && length(idx.subs) == 1 ...
&& length(idx.subs) < self.nd
% reference like A([2 3 1 5])
if self.tooBigToLoad
% number of elements in x
ind = idx.subs{1};
% transform index to subscript
subs = cell(1,self.nd);
[subs{:}] = ind2sub(size(self),ind);
% make a nice array length(ind) by self.nd
subs = cell2mat(subs);
% output array
x = zeros(size(ind));
x(:) = NaN;
% get every element
% can be quite slow
idxe.type = '()';
idxe.subs = cell(1,self.nd);
for i=1:length(ind)
idxe.subs = mat2cell(subs(i,:),1,ones(1,self.nd));
x(i) = subsref(self,idxe);
endfor
else
% load full array
tmp = full(self);
x = subsref(tmp,idx);
endif
else
[start, count, stride] = ncsub(self,idx);
if any(count == 0)
x = zeros(count);
else
x = ncread(cached_decompress(self.filename),self.varname,...
start,count,stride);
endif
endif
elseif strcmp(idx.type,'.')
% load attribute
name = idx.subs;
% strmatch is obsolete
% index = strmatch(name,{self.vinfo.Attributes(:).Name});
index = find(strcmp(name,{self.vinfo.Attributes(:).Name}));
if isempty(index)
error('variable %s has no attribute called %s',self.varname,name);
else
x = self.vinfo.Attributes(index).Value;
endif
else
error('not supported');
endif
endfunction
|