home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l455 / 2.ddi / MUTOOLS1.DI$ / SBS.M < prev    next >
Encoding:
Text File  |  1993-03-11  |  3.1 KB  |  104 lines

  1. % function out = sbs(mat1,mat2,mat3,...,matN)
  2. %
  3. %   Place SYSTEM/VARYING/CONSTANT matrices next to
  4. %   one another. Currently limited to 9 input matrices.
  5. %   All of the matrices must have the same number of
  6. %   rows (outputs).
  7. %
  8. %   out = [mat1  mat2  mat3  ...  matN]
  9. %
  10. %   See also: ABV, MADD, DAUG, MMULT, and MSCL.
  11.  
  12. function out = sbs(mat1,mat2,mat3,mat4,mat5,mat6,mat7,mat8,mat9)
  13.  if nargin < 2
  14.    disp('usage: out = sbs(mat1,mat2,mat3,...,matN)')
  15.    return
  16.  elseif nargin == 2
  17.    le = mat1;
  18.    ri = mat2;
  19.    if isempty(le)
  20.      out = ri;
  21.    elseif isempty(ri)
  22.      out = le;
  23.    else
  24.      [ltype,lrows,lcols,lnum] = minfo(le);
  25.      [rtype,rrows,rcols,rnum] = minfo(ri);
  26.      if (ltype == 'vary' & rtype == 'syst') | ...
  27.          (ltype == 'syst' & rtype == 'vary')
  28.        error('side-by-side of SYSTEM and VARYING not allowed')
  29.        return
  30.      elseif lrows ~= rrows
  31.        error('incompatible row (input) dimensions')
  32.        return
  33.      end
  34.      if ltype == 'vary'
  35.        if rtype == 'vary'
  36. %     [VARYING VARYING]
  37.          code = indvcmp(le,ri);
  38.          if code == 1;
  39.            [vdl,rpl,indvl] = vunpck(le);
  40.            [vdr,rpr,indvr] = vunpck(ri);
  41.        out = zeros(lrows*lnum+1,lcols+rcols+1);
  42.        out(lrows*lnum+1,lcols+rcols+1) = inf;
  43.        out(lrows*lnum+1,lcols+rcols) = lnum;
  44.        out(1:lnum,lcols+rcols+1) = indvl;
  45.        out(1:lrows*lnum,1:lcols+rcols) = [vdl vdr];
  46.          else
  47.            error('varying data is inconsistent')
  48.            return
  49.          end
  50.        else
  51. %     [VARYING CONSTANT]
  52.          [vdl,rpl,indvl] = vunpck(le);
  53.      out = zeros(lrows*lnum+1,lcols+rcols+1);
  54.      out(lrows*lnum+1,lcols+rcols+1) = inf;
  55.      out(lrows*lnum+1,lcols+rcols) = lnum;
  56.      out(1:lnum,lcols+rcols+1) = indvl;
  57.      out(1:lrows*lnum,1:lcols+rcols) = [vdl kron(ones(lnum,1),ri)];
  58.        end
  59.      elseif ltype == 'cons'
  60.        if rtype == 'vary'
  61. %     [CONSTANT VARYING]
  62.          [vdr,rpr,indvr] = vunpck(ri);
  63.      out = zeros(lrows*rnum+1,lcols+rcols+1);
  64.      out(lrows*rnum+1,lcols+rcols+1) = inf;
  65.      out(lrows*rnum+1,lcols+rcols) = rnum;
  66.      out(1:rnum,lcols+rcols+1) = indvr;
  67.      out(1:lrows*rnum,1:lcols+rcols) = [kron(ones(rnum,1),le) vdr];
  68.        elseif rtype == 'cons'
  69.          out = [le ri];
  70.        else
  71.          [a,b,c,d] = unpck(ri);
  72.          bb = [zeros(rnum,lcols) b];
  73.          dd = [le d];
  74.          out = pck(a,bb,c,dd);
  75.        end
  76.      else
  77.        if rtype == 'cons'
  78.          [a,b,c,d] = unpck(le);
  79.          bb = [b zeros(lnum,rcols)];
  80.          dd = [d ri];
  81.          out = pck(a,bb,c,dd);
  82.        else
  83.          [ale,ble,cle,ddle] = unpck(le);
  84.          [ari,bri,cri,ddri] = unpck(ri);
  85.          a = [ale zeros(lnum,rnum) ; zeros(rnum,lnum) ari];
  86.          b = [ble zeros(lnum,rcols) ; zeros(rnum,lcols) bri];
  87.          c = [cle cri];
  88.          d = [ddle ddri];
  89.          out = pck(a,b,c,d);
  90.        end
  91.      end
  92.    end
  93.  else
  94. %   recursive call for multiple input arguments
  95.    exp = ['out=sbs(sbs('];
  96.    for i=1:nargin-2
  97.      exp=[exp 'mat' int2str(i) ','];
  98.    end
  99.    exp = [exp 'mat' int2str(nargin-1) '),mat' int2str(nargin) ');'];
  100.    eval(exp);
  101.  end
  102. %
  103. % Copyright MUSYN INC 1991,  All Rights Reserved
  104.