diff m-toolbox/classes/@ssm/reshuffle.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/reshuffle.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,75 @@
+% RESHUFFLE rearragnes a ssm object using the given inputs and outputs.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: rearranges a ssm object using the given inputs and outputs.
+%
+% CALL:    sys = reshuffle(sys, inputs1, inputs2, inputs3,  states,
+% outputs, outputStates)
+%
+% INPUTS:
+%         'sys'           - ssm object
+%         'inputs1'       - these will constitute the input block 1 of the output
+%                         ssm (order is user defined)
+%         'inputs2'       - these will constitute the input block 1 of the output
+%                         ssm (order is user defined)
+%         'inputs3'       - these will constitute the input block 1 of the output
+%                         ssm (order is user defined)
+%         'states'        - states to keep (order is user defined)
+%         'outputs'       - outputs to keep, first output block (order is user
+%                         defined) 
+%         'outputStates'  - states to return as an output, second output block 
+%                         (order is user defined) 
+%
+%  The inputs/states/outputs can only be indexed using a cellstr containing
+%  block names or port names.
+%
+% OUTPUTS:
+%
+%        'sys' - a ssm object.
+%
+% VERSION :
+%   $Id: reshuffle.m,v 1.7 2011/04/08 08:56:23 hewitson Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function sys = reshuffle(sys, inputs1, inputs2, inputs3,  states, outputs, outputStates)
+  
+  [iBlockInputs1   iPortInputs1]     = findPortWithMixedNames( sys.inputs, inputs1 );
+  [iBlockInputs2   iPortInputs2]     = findPortWithMixedNames( sys.inputs, inputs2 );
+  [iBlockInputs3   iPortInputs3]     = findPortWithMixedNames( sys.inputs, inputs3 );
+  [iBlockStatesOut iPortStatesOut]   = findPortWithMixedNames( sys.states, outputStates );
+  [iBlockStates    iPortStates]      = findPortWithMixedNames( sys.states, states );
+  [iBlockOutputsOut iPortOutputsOut] = findPortWithMixedNames( sys.outputs, outputs );
+  
+  inputs1    = mergeBlocksWithPositionIndex(sys.inputs, iBlockInputs1, iPortInputs1, 'inputs1');
+  inputs2    = mergeBlocksWithPositionIndex(sys.inputs, iBlockInputs2, iPortInputs2, 'inputs2');
+  inputs3    = mergeBlocksWithPositionIndex(sys.inputs, iBlockInputs3, iPortInputs3, 'inputs3');
+  States     = mergeBlocksWithPositionIndex(sys.states, iBlockStates, iPortStates, 'states');
+  StatesOut  = mergeBlocksWithPositionIndex(sys.states, iBlockStatesOut, iPortStatesOut, 'statesOut');
+  OutputsOut = mergeBlocksWithPositionIndex(sys.outputs, iBlockOutputsOut, iPortOutputsOut, 'outputsOut');
+  
+  %                      cell_mat  lines wanted                        cols wanted
+  A = ssm.blockMatIndex(sys.amats, iBlockStates   ,  iPortStates   ,   iBlockStates   , iPortStates   );
+  C = ssm.blockMatIndex(sys.cmats, iBlockOutputsOut, iPortOutputsOut,  iBlockStates   , iPortStates   );
+  B = ssm.blockMatIndex(sys.bmats, iBlockStates   ,  iPortStates   ,   iBlockInputs1,   iPortInputs1);
+  D = ssm.blockMatIndex(sys.dmats, iBlockOutputsOut, iPortOutputsOut,  iBlockInputs1,   iPortInputs1);
+  E = ssm.blockMatIndex(sys.bmats, iBlockStates   ,  iPortStates   ,   iBlockInputs2,   iPortInputs2);
+  F = ssm.blockMatIndex(sys.dmats, iBlockOutputsOut, iPortOutputsOut,  iBlockInputs2,   iPortInputs2);
+  G = ssm.blockMatIndex(sys.bmats, iBlockStates   ,  iPortStates   ,   iBlockInputs3,   iPortInputs3);
+  H = ssm.blockMatIndex(sys.dmats, iBlockOutputsOut, iPortOutputsOut,  iBlockInputs3,   iPortInputs3);
+  
+  Y       = eye(sum(sys.statesizes));
+  Y       = ssm.blockMatRecut(Y, sys.statesizes, sys.statesizes);
+  Cstates = ssm.blockMatIndex( Y, iBlockStatesOut, iPortStatesOut,  iBlockStates   , iPortStates    );
+  
+  sys.amats = {A};
+  sys.bmats = {B E G };
+  sys.cmats = {Cstates; C};
+  sys.dmats = {[] zeros(size(Cstates,1),size(F,2)) zeros(size(Cstates,1), size(H,2)) ;...
+    D F H };
+  
+  sys.inputs = [inputs1 inputs2 inputs3];
+  sys.states = States   ;
+  sys.outputs = [StatesOut OutputsOut];
+  
+end