diff m-toolbox/classes/@ssm/blockMatRecut.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/@ssm/blockMatRecut.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,96 @@
+% cuts a matrix into blocks stored inside cell array
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: blockMatRecut  cuts a matrix into blocks stored inside cell
+% array. Blocks with zeros are nullified, except in the diagonal (to
+% preserve information on matrix size)
+%
+% CALL: [cell3] = ssm.blockMatRecut(mat1,rowsizes,colsizes)
+%
+% INPUTS:
+%       mat1     - numeric array to be cut in pieces
+%       rowsizes - vector giving block height
+%       colsizes - vector giving block width
+%
+% OUTPUTS:
+%       cell3 - cell array of matrices representing a matrix by blocs.
+%               blocs may be empty
+%
+% NOTE : function is private to the ssm class
+%
+% VERSION: '$Id: blockMatRecut.m,v 1.5 2011/04/08 08:56:23 hewitson Exp $'
+%
+% TO DO :
+% check ME in case of mixed symbolic and double
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function a_out = blockMatRecut(a, rowsizes, colsizes)
+  % to deal with matrices whose size is not defined
+  rowrank = cumsum([1 rowsizes]);
+  colrank = cumsum([1 colsizes]);
+  Nrow = length(rowsizes);
+  Ncol = length(colsizes);
+  a_out = cell(Nrow, Ncol);
+  
+  for i=1:Nrow
+    for j=1:Ncol
+      % getting position
+      rowmin = rowrank(i);
+      rowmax = rowrank(i+1)-1;
+      colmin = colrank(j);
+      colmax = colrank(j+1)-1;
+      % selecting data
+      content = a(rowmin:rowmax, colmin:colmax);
+      
+      % filling block data
+      if min(i, Ncol)==min(j, Nrow)
+        % if we are on the extended diagonal
+        
+        if isa(content, 'sym')
+          % try convert the sym to a double
+          try
+            a_out{i,j} = double(content);
+          catch
+            a_out{i,j} = content;
+          end
+        else
+          % cut a piece and keep the class appartenance (ex for logical)
+          a_out{i,j} = content;
+        end
+        
+      else
+        
+        % if we are not on the extended diagonal
+        if isempty(content)
+           % delete it if it is empty
+           a_out{i,j} = [];
+        elseif isa(a, 'sym')
+          try
+            % try convert the sym to a double
+            content = double(content);
+            if norm(content)==0
+              % delete it if it is a double filled with zeros
+              a_out{i,j} = [];
+            else
+              a_out{i,j} = content;
+            end
+          catch
+            a_out{i,j} = content;
+          end
+        elseif isa(content, 'logical')
+          % keep the logical as it is
+          a_out{i,j} = content;
+        elseif norm(content)==0
+          % delete it if it is a double filled with zeros
+          a_out{i,j}=[];
+        else
+          % copy it is a non-zero double
+          a_out{i,j} = content;
+        end
+        
+      end
+      
+      clear content
+    end
+  end
+end