Mercurial > hg > ltpda
diff m-toolbox/classes/@ssm/blockMatIndex.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/blockMatIndex.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,61 @@ +% adds corresponding matrices of same sizes or empty inside cell array +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: blockMatAdd adds corresponding matrices of same sizes or empty inside +% cell array +% +% CALL: [cell3] = ssm.blockMatAdd(cell1,cell2) +% +% INPUTS: +% cell1 - cell array of matrices representing a matrix by blocs. +% blocs may be empty +% cell2 - cell array of matrices representing a matrix by blocs. +% blocs may be empty +% +% 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: blockMatIndex.m,v 1.8 2011/02/02 19:25:30 adrien Exp $' +% +% TO DO : +% check ME in case of mixed symbolic and double +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function a = blockMatIndex(amats, blockIndex1, portIndex1, blockIndex2, portIndex2 ) + %% filling binary array to check is location is empty + isEmpty = cellfun(@isempty, amats); + + Nrow = size(amats,1); + Ncol = size(amats,2); + + n1 = numel(blockIndex1); + n2 = numel(blockIndex2); + a = zeros(n1, n2); + + %% rebuilding input indexing vector + [groupedBlockIndex1, groupedPortIndex1, groupSize1, nGroups1, globalPortIndex1] = ssmblock.groupIndexes(blockIndex1, portIndex1); + [groupedBlockIndex2, groupedPortIndex2, groupSize2, nGroups2, globalPortIndex2] = ssmblock.groupIndexes(blockIndex2, portIndex2); + %% Copying content + for ii=1:nGroups1 + bi = groupedBlockIndex1(ii); + pi = groupedPortIndex1{ii}; + for jj=1:nGroups2 + bj = groupedBlockIndex2(jj); + if ~isEmpty(bi, bj) || min(bi,Nrow)==min(bj,Ncol) + % if we have a non-empty cell or we are on the extended diagonal + val = amats{bi, bj}(pi,groupedPortIndex2{jj}); + if isa(val, 'sym') && ~isa(a, 'sym') + a = sym(a); + end + a(globalPortIndex1{ii},globalPortIndex2{jj}) = val; + + end + end + end + +end + + +