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

  1. % function out = mmult(mat1,mat2,mat3,...,matN)
  2. %
  3. %   Multiplies SYSTEM/VARYING/CONSTANT matrices, currently
  4. %   limited to 9 input arguments
  5. %
  6. %   out = mat1*mat2*mat3* *** *matN
  7. %
  8. %   See also: *, ABV, MADD, MSCL, and MSUB.
  9.  
  10. function out = mmult(mat1,mat2,mat3,mat4,mat5,mat6,mat7,mat8,mat9)
  11.   if nargin <= 1
  12.     disp('usage: out = mmult(mat1,mat2,mat3,...,matN)')
  13.     return
  14.   elseif nargin == 2
  15.     [m1type,m1rows,m1cols,m1num] = minfo(mat1);
  16.     [m2type,m2rows,m2cols,m2num] = minfo(mat2);
  17.     if (m1type == 'syst' & m2type == 'vary') | ...
  18.          (m1type == 'vary' & m2type == 'syst')
  19.       error('MMULT of SYSTEM and VARYING not allowed')
  20.       return
  21.     elseif m1type == 'empt' | m2type == 'empt'
  22.       out = [];
  23.       return
  24.     elseif m1cols ~= m2rows
  25.       error('MMULT incompatible inner dimensions')
  26.       return
  27.     end
  28.     outrows = m1rows;
  29.     outcols = m2cols;
  30.     if m1type == 'vary'
  31.       if m2type == 'vary'
  32. %       both varying
  33.         code = indvcmp(mat1,mat2);
  34.         if code == 1
  35.           [vd1,rp1,indv1] = vunpck(mat1);
  36.           [vd2,rp2,indv2] = vunpck(mat2);
  37.           out = zeros(m1num*m1rows+1,m2cols+1);
  38.       out(m1num*m1rows+1,m2cols+1) = inf;
  39.       out(m1num*m1rows+1,m2cols) = m1num;
  40.       out(1:m1num,m2cols+1) = indv1;
  41.           for i=1:m1num
  42.              out(rp1(i):rp1(i)+m1rows-1,1:m2cols) = ...
  43.                 mat1(rp1(i):rp1(i)+m1rows-1,1:m1cols)...
  44.                 *mat2(rp2(i):rp2(i)+m2rows-1,1:m2cols);
  45.           end
  46.         else
  47.           error('inconsistent varying data')
  48.       return
  49.         end
  50.       else
  51. %       varying*constant
  52.         [vd1,rp1,indv1] = vunpck(mat1);
  53.         out = zeros(m1num*m1rows+1,m2cols+1);
  54.     out(m1num*m1rows+1,m2cols+1) = inf;
  55.     out(m1num*m1rows+1,m2cols) = m1num;
  56.     out(1:m1num,m2cols+1) = indv1;
  57.         out(1:m1num*m1rows,1:m2cols) = vd1*mat2;
  58.       end
  59.     elseif m1type == 'cons'
  60.       if m2type == 'vary'
  61. %       constant*varying
  62.         [vd2,rp2,indv2] = vunpck(mat2);
  63.         out = zeros(m2num*m1rows+1,m2cols+1);
  64.     out(m2num*m1rows+1,m2cols+1) = inf;
  65.     out(m2num*m1rows+1,m2cols) = m2num;
  66.     out(1:m2num,m2cols+1) = indv2;
  67.         tmp = mat1 * reshape(vd2,m2rows,m2num*m2cols);
  68.         out(1:m2num*m1rows,1:m2cols) = reshape(tmp,m1rows*m2num,m2cols);
  69.       elseif m2type == 'cons'
  70. %       constant*constant
  71.         out = mat1 * mat2;
  72.       else
  73. %       constant*system
  74.         [a,b,c,d] = unpck(mat2);
  75.         out = pck(a,b,mat1*c,mat1*d);
  76.       end
  77.     else
  78.       if m2type == 'cons'
  79. %       system*constant
  80.         [a,b,c,d] = unpck(mat1);
  81.         out = pck(a,b*mat2,c,d*mat2);
  82.       else
  83. %       system*system
  84.         [a1,b1,c1,d1] = unpck(mat1);
  85.         [a2,b2,c2,d2] = unpck(mat2);
  86.         zer = zeros(m2num,m1num);
  87.         a = [a1 b1*c2 ; zer a2];
  88.         b = [b1*d2 ; b2];
  89.         c = [c1 d1*c2];
  90.         d = d1*d2;
  91.         out = pck(a,b,c,d);
  92.       end
  93.     end
  94.   else
  95.     exp = ['out=mmult(mmult('];
  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.