0001 function x=sylvester3(a,b,c,d)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 n = size(a,1);
0022 m = size(c,1);
0023 p = size(d,3);
0024 x=zeros(n,m,p);
0025 if n == 1
0026 for j=1:p,
0027 x(:,:,j)=d(:,:,j)./(a*ones(1,m)+b*c);
0028 end
0029 return
0030 end
0031 if m == 1
0032 for j=1:p,
0033 x(:,:,j) = (a+c*b)\d(:,:,j);
0034 end
0035 return;
0036 end
0037 [u,t]=schur(c);
0038 if exist('OCTAVE_VERSION')
0039 [aa,bb,qq,zz]=qz(full(a),full(b));
0040 for j=1:p,
0041 if octave_ver_less_than('3.4.0')
0042 d(:,:,j)=qq'*d(:,:,j)*u;
0043 else
0044 d(:,:,j)=qq*d(:,:,j)*u;
0045 end
0046 end
0047 else
0048 [aa,bb,qq,zz]=qz(full(a),full(b),'real');
0049 for j=1:p,
0050 d(:,:,j)=qq*d(:,:,j)*u;
0051 end
0052 end
0053 i = 1;
0054 c = zeros(n,1,p);
0055 while i < m
0056 if t(i+1,i) == 0
0057 if i == 1
0058 c = zeros(n,1,p);
0059 else
0060 for j=1:p,
0061 c(:,:,j) = bb*(x(:,1:i-1,j)*t(1:i-1,i));
0062 end
0063 end
0064 x(:,i,:)=(aa+bb*t(i,i))\squeeze(d(:,i,:)-c);
0065 i = i+1;
0066 else
0067 if i == n
0068 c = zeros(n,1,p);
0069 c1 = zeros(n,1,p);
0070 else
0071 for j=1:p,
0072 c(:,:,j) = bb*(x(:,1:i-1,j)*t(1:i-1,i));
0073 c1(:,:,j) = bb*(x(:,1:i-1,j)*t(1:i-1,i+1));
0074 end
0075 end
0076 bigmat = ([aa+bb*t(i,i) bb*t(i+1,i); bb*t(i,i+1) aa+bb*t(i+1,i+1)]);
0077 z = bigmat\squeeze([d(:,i,:)-c;d(:,i+1,:)-c1]);
0078 x(:,i,:) = z(1:n,:);
0079 x(:,i+1,:) = z(n+1:end,:);
0080 i = i + 2;
0081 end
0082 end
0083 if i == m
0084 for j=1:p,
0085 c(:,:,j) = bb*(x(:,1:m-1,j)*t(1:m-1,m));
0086 end
0087 aabbt = (aa+bb*t(m,m));
0088 x(:,m,:)=aabbt\squeeze(d(:,m,:)-c);
0089 end
0090 for j=1:p,
0091 x(:,:,j)=zz*x(:,:,j)*u';
0092 end
0093
0094
0095