Mercurial > hg > ltpda
diff m-toolbox/classes/@ssm/blockMatFusion.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/blockMatFusion.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,51 @@ +% fusions a block defined matrix stored inside cell array into one matrix +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: blockMatFusion fusions a block defined matrix stored inside cell +% array into one matrix +% +% CALL: [mat3] = ssm.blockMatFusion(cell1, rowsizes, colsizes) +% +% INPUTS: +% cell1 - cell array of matrices representing a matrix by blocs. +% blocs may be empty +% rowsizes - vector giving block height +% colsizes - vector giving block width +% +% OUTPUTS: +% mat3 - double or symbolic array +% +% NOTE : function is private to the ssm class +% +% VERSION: '$Id: blockMatFusion.m,v 1.3 2010/08/27 13:02:45 adrien Exp $' +% +% TO DO : +% check ME in case of mixed symbolic and double +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function a_out = blockMatFusion(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); + isEmpty = cellfun(@isempty, a); + + a_out = zeros(rowrank(Nrow+1)-1, colrank(Ncol+1)-1); + for ii=1:Nrow + for jj=1:Ncol + if ~isEmpty(ii,jj) + rowmin = rowrank(ii); + rowmax = rowrank(ii+1)-1; + colmin = colrank(jj); + colmax = colrank(jj+1)-1; + try + a_out(rowmin:rowmax, colmin:colmax) = a{ii,jj}; + catch ME + a_out = sym(a_out); + a_out(rowmin:rowmax, colmin:colmax) = sym(a{ii,jj}); + end + end + end + end +end