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

  1. % function out = madd(mat1,mat2,mat3,...,matN)
  2. %
  3. %   Add SYSTEM/VARYING/CONSTANT matrices, currently limited
  4. %   to 9 input arguments
  5. %
  6. %   out = mat1 + mat2 + mat3 + ... + matN
  7. %
  8. %   See also: +, ABV, DAUG, MMULT, SBS, SEL, and MSUB.
  9.  
  10. function out = madd(mat1,mat2,mat3,mat4,mat5,mat6,mat7,mat8,mat9)
  11.   if nargin <= 1
  12.     disp('usage: out = madd(mat1,mat2)')
  13.     return
  14.   elseif nargin == 2
  15.     [onetype,onerows,onecols,onenum] = minfo(mat1);
  16.     [twotype,tworows,twocols,twonum] = minfo(mat2);
  17.     if onetype == 'empt' & twotype == 'empt'
  18.       out = [];
  19.       return
  20.     end
  21.     if (onetype == 'syst' & twotype == 'vary') | ...
  22.           (onetype == 'vary' & twotype == 'syst')
  23.        error('addition of SYSTEM and VARYING not allowed')
  24.        return
  25.     elseif onerows ~= tworows | onecols ~= twocols
  26.       error('incompatible dimensions in MADD')
  27.       return
  28.     end
  29.     if onetype == 'vary'
  30.       if twotype == 'vary'
  31. %       both VARYING
  32.         code = indvcmp(mat1,mat2);
  33.         if code == 1
  34.           [nr,nc] = size(mat1);
  35.           [vd1,rp1,indv1] = vunpck(mat1);
  36.           [vd2,rp2,indv2] = vunpck(mat2);
  37.       out = zeros(onenum*onerows+1,onecols+1);
  38.       out(onenum*onerows+1,onecols+1) = inf;
  39.       out(onenum*onerows+1,onecols) = onenum;
  40.       out(1:onenum,onecols+1) = indv1;
  41.       out(1:onenum*onerows,1:onecols) = vd1+vd2;
  42.         else
  43.           error(['inconsistent varying data'])
  44.           return
  45.         end
  46.       else
  47. %       VARYING+CONSTANT
  48.         [vd1,rp1,indv1] = vunpck(mat1);
  49.     out = zeros(onenum*onerows+1,onecols+1);
  50.     out(onenum*onerows+1,onecols+1) = inf;
  51.     out(onenum*onerows+1,onecols) = onenum;
  52.     out(1:onenum,onecols+1) = indv1;
  53.     out(1:onenum*onerows,1:onecols) = vd1+kron(ones(onenum,1),mat2);
  54.       end
  55.     elseif onetype == 'cons'
  56.       if twotype == 'vary'
  57. %       CONSTANT+VARYING
  58.         [vd2,rp2,indv2] = vunpck(mat2);
  59.     out = zeros(twonum*onerows+1,onecols+1);
  60.     out(twonum*onerows+1,onecols+1) = inf;
  61.     out(twonum*onerows+1,onecols) = twonum;
  62.     out(1:twonum,onecols+1) = indv2;
  63.     out(1:twonum*onerows,1:onecols) = vd2+kron(ones(twonum,1),mat1);
  64.       elseif twotype == 'cons'
  65. %       CONSTANT+CONSTANT
  66.         out = mat1 + mat2;
  67.       else
  68. %       CONSTANT+SYSTEM
  69.         [a,b,c,d] = unpck(mat2);
  70.         out = pck(a,b,c,mat1+d);
  71.       end
  72.     else
  73.       if twotype == 'cons'
  74. %       SYSTEM+CONSTANT
  75.         [a,b,c,d] = unpck(mat1);
  76.         out = pck(a,b,c,d+mat2);
  77.       else
  78. %       SYSTEM+SYSTEM
  79.         [a1,b1,c1,d1] = unpck(mat1);
  80.         [a2,b2,c2,d2] = unpck(mat2);
  81.         zer = zeros(twonum,onenum);
  82.         a = [a1 zer' ; zer a2];
  83.         b = [b1 ; b2];
  84.         c = [c1 c2];
  85.         d = d1+d2;
  86.         out = pck(a,b,c,d);
  87.       end
  88.     end
  89.   else
  90.  %   recursive call for multiple input arguments
  91.     exp = ['out=madd(madd('];
  92.     for i=1:nargin-2
  93.       exp=[exp 'mat' int2str(i) ','];
  94.     end
  95.     exp = [exp 'mat' int2str(nargin-1) '),mat' int2str(nargin) ');'];
  96.     eval(exp);
  97.   end
  98. %
  99. % Copyright MUSYN INC 1991,  All Rights Reserved
  100.