diff scripts/control/system/sysgroup.m @ 5568:e9cde940b271

[project @ 2005-12-08 02:28:22 by jwe]
author jwe
date Thu, 08 Dec 2005 02:28:22 +0000
parents 4c8a2e4e0717
children 34f96dd5441b
line wrap: on
line diff
--- a/scripts/control/system/sysgroup.m	Wed Dec 07 06:31:28 2005 +0000
+++ b/scripts/control/system/sysgroup.m	Thu Dec 08 02:28:22 2005 +0000
@@ -59,145 +59,137 @@
 
 function sys = sysgroup (varargin)
 
-  save_warn_empty_list_elements = warn_empty_list_elements;
-  unwind_protect
-    warn_empty_list_elements = 0;
-
-    if(nargin < 1)
-      usage("sys = sysgroup(Asys{,Bsys,...})");
-    endif
+  if(nargin < 1)
+    usage("sys = sysgroup(Asys{,Bsys,...})");
+  endif
 
-    ## collect all arguments
-    arglist = {};
-    for kk=1:nargin
-      arglist(kk) = varargin{kk};
-      if(!isstruct(arglist{kk}))
+  ## collect all arguments
+  arglist = {};
+  for kk=1:nargin
+    arglist(kk) = varargin{kk};
+    if(!isstruct(arglist{kk}))
 	error("sysgroup: argument %d is not a data structure",kk);
-      endif
-    endfor
+    endif
+  endfor
 
-    if(nargin == 2)
-      ## the usual case; group the two systems together
-      Asys = arglist{1};
-      Bsys = arglist{2};
+  if(nargin == 2)
+    ## the usual case; group the two systems together
+    Asys = arglist{1};
+    Bsys = arglist{2};
 
-      ## extract information from Asys, Bsys to consruct sys
-      Asys = sysupdate(Asys,"ss");
-      Bsys = sysupdate(Bsys,"ss");
-      [n1,nz1,m1,p1] = sysdimensions(Asys);
-      [n2,nz2,m2,p2] = sysdimensions(Bsys);
-      [Aa,Ab,Ac,Ad,Atsam,An,Anz,Ast,Ain,Aout,Ayd] = sys2ss(Asys);
-      [Ba,Bb,Bc,Bd,Btsam,Bn,Bnz,Bst,Bin,Bout,Byd] = sys2ss(Bsys);
-      nA = An + Anz;
-      nB = Bn + Bnz;
+    ## extract information from Asys, Bsys to consruct sys
+    Asys = sysupdate(Asys,"ss");
+    Bsys = sysupdate(Bsys,"ss");
+    [n1,nz1,m1,p1] = sysdimensions(Asys);
+    [n2,nz2,m2,p2] = sysdimensions(Bsys);
+    [Aa,Ab,Ac,Ad,Atsam,An,Anz,Ast,Ain,Aout,Ayd] = sys2ss(Asys);
+    [Ba,Bb,Bc,Bd,Btsam,Bn,Bnz,Bst,Bin,Bout,Byd] = sys2ss(Bsys);
+    nA = An + Anz;
+    nB = Bn + Bnz;
 
-      if(p1*m1*p2*m2 == 0)
+    if(p1*m1*p2*m2 == 0)
 	error("sysgroup: argument lacks inputs and/or outputs");
 
-      elseif((Atsam + Btsam > 0) & (Atsam * Btsam == 0) )
+    elseif((Atsam + Btsam > 0) & (Atsam * Btsam == 0) )
 	warning("sysgroup: creating combination of continuous and discrete systems")
 
-      elseif(Atsam != Btsam)
+    elseif(Atsam != Btsam)
 	error("sysgroup: Asys.tsam=%e, Bsys.tsam =%e", Atsam, Btsam);
-      endif
+    endif
+
+    if(nA*nB > 0)
+      A12 = zeros(nA,nB);
+    else
+      A12 = [];
+    endif
+    A = [Aa,A12; A12', Ba];
+
+    if(nA*m2 > 0)
+      B12 = zeros(nA,m2);
+    else
+      B12 = [];
+    endif
+    if(nB*m1 > 0)
+      B21 = zeros(nB,m1);
+    else
+      B21 = [];
+    endif
+    if(isempty(Ab))
+      Ab = [];
+    endif
+    if(isempty(Bb))
+      Bb = [];
+    endif
+    B = [Ab, B12; B21, Bb];
+
+    if(p1*nB > 0)
+      C12 = zeros(p1,nB);
+    else
+      C12 = [];
+    endif
+    if(p2*nA > 0)
+      C21 = zeros(p2,nA);
+    else
+      C21 = [];
+    endif
+    C = [Ac, C12; C21,Bc];
 
-      if(nA*nB > 0)
-        A12 = zeros(nA,nB);
-      else
-        A12 = [];
-      endif
-      A = [Aa,A12; A12', Ba];
- 
-      if(nA*m2 > 0)
-        B12 = zeros(nA,m2);
-      else
-        B12 = [];
-      endif
-      if(nB*m1 > 0)
-        B21 = zeros(nB,m1);
-      else
-        B21 = [];
-      endif
-      if(isempty(Ab))
-        Ab = [];
-      endif
-      if(isempty(Bb))
-        Bb = [];
-      endif
-      B = [Ab, B12; B21, Bb];
- 
-      if(p1*nB > 0)
-        C12 = zeros(p1,nB);
-      else
-        C12 = [];
-      endif
-      if(p2*nA > 0)
-        C21 = zeros(p2,nA);
-      else
-        C21 = [];
-      endif
-      C = [Ac, C12; C21,Bc];
- 
-      if(p1*m2 > 0)
-        D12 = zeros(p1,m2);
-      else
-        D12 = [];
-      endif
-      if(p2*m1 > 0)
-        D21 = zeros(p2,m1);
-      else
-        D21 = [];
-      endif
-      D = [Ad, D12; D21, Bd];
-      tsam = max(Atsam,Btsam);
+    if(p1*m2 > 0)
+      D12 = zeros(p1,m2);
+    else
+      D12 = [];
+    endif
+    if(p2*m1 > 0)
+      D21 = zeros(p2,m1);
+    else
+      D21 = [];
+    endif
+    D = [Ad, D12; D21, Bd];
+    tsam = max(Atsam,Btsam);
+
+    ## construct combined signal names; stnames must check for pure gain blocks
+    if(isempty(Ast))
+	stname = Bst;
+    elseif(isempty(Bst))
+	stname = Ast;
+    else
+      stname= __sysconcat__(Ast,Bst);
+    endif
+    inname = __sysconcat__(Ain,Bin);
+    outname = __sysconcat__(Aout,Bout);
 
-      ## construct combined signal names; stnames must check for pure gain blocks
-      if(isempty(Ast))
-	stname = Bst;
-      elseif(isempty(Bst))
-	stname = Ast;
-      else
-        stname= __sysconcat__(Ast,Bst);
-      endif
-      inname = __sysconcat__(Ain,Bin);
-      outname = __sysconcat__(Aout,Bout);
-
-      ## Sort states into continous first, then discrete
-      dstates = ones(1,(nA+nB));
-      if(An)
+    ## Sort states into continous first, then discrete
+    dstates = ones(1,(nA+nB));
+    if(An)
 	dstates(1:(An)) = zeros(1,An);
-      endif
-      if(Bn)
+    endif
+    if(Bn)
 	dstates((nA+1):(nA+Bn)) = zeros(1,Bn);
-      endif
-      [tmp,pv] = sort(dstates);
-      A = A(pv,pv);
-      B = B(pv,:);
-      C = C(:,pv);
-      stname = stname(pv);
+    endif
+    [tmp,pv] = sort(dstates);
+    A = A(pv,pv);
+    B = B(pv,:);
+    C = C(:,pv);
+    stname = stname(pv);
 
-      ## check for duplicate signal names
-      inname = __sysgroupn__ (inname, "input");
-      stname = __sysgroupn__ (stname, "state");
-      outname = __sysgroupn__ (outname, "output");
+    ## check for duplicate signal names
+    inname = __sysgroupn__ (inname, "input");
+    stname = __sysgroupn__ (stname, "state");
+    outname = __sysgroupn__ (outname, "output");
 
-      ## mark discrete outputs
-      outlist = find([Ayd, Byd]);
+    ## mark discrete outputs
+    outlist = find([Ayd, Byd]);
 
-      ## build new system
-      sys = ss(A,B,C,D,tsam,An+Bn,Anz+Bnz,stname,inname,outname);
+    ## build new system
+    sys = ss(A,B,C,D,tsam,An+Bn,Anz+Bnz,stname,inname,outname);
 
-    else
-      ## multiple systems (or a single system); combine together one by one
-      sys = arglist{1};
-      for kk=2:length(arglist)
+  else
+    ## multiple systems (or a single system); combine together one by one
+    sys = arglist{1};
+    for kk=2:length(arglist)
 	printf("sysgroup: kk=%d\n",kk);
 	sys = sysgroup(sys,arglist{kk});
-      endfor
-    endif
-
-  unwind_protect_cleanup
-    warn_empty_list_elements = save_warn_empty_list_elements;
-  end_unwind_protect
+    endfor
+  endif
 
 endfunction