File: subsref.m

package info (click to toggle)
octave-ncarray 1.0.6-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 352 kB
  • sloc: makefile: 144
file content (86 lines) | stat: -rw-r--r-- 2,603 bytes parent folder | download | duplicates (2)
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