view extra/ncArray/inst/@CatArray/subsref.m @ 12615:0039c65e5e44 octave-forge

fix bug when CatArray is indexed with (:)
author abarth93
date Tue, 12 May 2015 20:26:49 +0000
parents 7e8fe66357df
children
line wrap: on
line source

function B = subsref(self,idx)

% handle case with a single subscript
% for example CA(234)
if strcmp(idx.type,'()') && length(idx.subs) == 1
    % indices of elements in B
    ind = idx.subs{1};

    if strcmp(ind,':')
        ind = [1:numel(self)]';
    end

    % output array
    B = zeros(size(ind));
    B(:) = NaN;
    
    if self.overlap 
        % transform linear index ind to subscript subs
        subs = cell(1,self.nd);
        [subs{:}] = ind2sub(size(self),ind);
        
        % make a nice array length(ind) by self.nd
        subs = cell2mat(subs);
        
        
        % get every element
        idxe.type = '()';
        idxe.subs = cell(1,self.nd);
        
        for i=1:length(ind)
            idxe.subs = mat2cell(subs(i,:),1,ones(1,self.nd));
            B(i) = subsref_canonical(self,idxe);
        end
    else
        % assume all arrays does not overlap
                
        for j=1:self.na
            sel = self.bounds(j) < ind & ind <= self.bounds(j+1);
            B(sel) = self.arrays{j}(ind(sel) - self.bounds(j));
        end
        
    end
elseif strcmp(idx.type,'.')
  % load attributes from first array
    B = subsref(self.arrays{1},idx);
else
    B = subsref_canonical(self,idx);
end

end

% for this function we assume that idx.subs has the same dimension than
% the array

function B = subsref_canonical(self,idx)
[idx_global,idx_local,sz] = idx_global_local_(self,idx);

B = zeros(sz);
B(:) = NaN;

for j=1:self.na
    % get subset from j-th array
    subset = subsref(self.arrays{j},idx_local{j});
    
    % set subset in global array B
    % this is slow, why?
    %B = subsasgn(B,idx_global{j},subset);
    
    % however this quite fast
    idxa = idx_global{j}.subs;   
    B(idxa{:}) = subset;
end

end


% 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 2 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/>.