% blockMatPRUNE selects lines and columns of a block defined matrices stored in a cell array
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% DESCRIPTION: cell_select selects lines and columns of a block defined
%              matrices stored in a cell array
%
% CALL: [cell2] = ssm.cell_array_prune(cell1,rowindex,colindex)
%
% INPUTS:
%       cell1    - block defined matrix in cell array
%       rowsizes - vector giving block height
%       colsizes - vector giving block width
%
% OUTPUTS:
%       cell2 - cell array of matrices representing a matrix by blocs.
%               blocs may be empty
%
% NOTE : function is private to the ssm class
%
% VERSION: '$Id: blockMatPrune.m,v 1.6 2011/04/08 08:56:22 hewitson Exp $'
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function varargout  = blockMatPrune(varargin)
  
  cell_in = varargin{1};
  rowindex = varargin{2};
  colindex = varargin{3};
  Nrows = numel(rowindex);
  Ncols = numel(colindex);
  
  %% selecting content
  cell_out = cell(Nrows, Ncols);
  for ii=1:Nrows
    for jj=1:Ncols
      if ~isequal(cell_in{ii,jj}, []) ||  min(ii, Ncols)==min(jj, Nrows)
        % if we have a non-empty cell or we are on the extended diagonal
        cell_out{ii,jj} = cell_in{ii,jj}(rowindex{ii},colindex{jj});
      end
    end
  end
  
  varargout = {cell_out};
end
