0001
0002 function x=sylvester3(a,b,c,d)
0003 n = size(a,1);
0004 m = size(c,1);
0005 if n == 1
0006 x=d./(a*ones(1,m)+b*c);
0007 return
0008 end
0009 if m == 1
0010 x = (a+c*b)\d;
0011 return;
0012 end
0013 x=zeros(n,m);
0014 [u,t]=schur(c);
0015 [aa,bb,qq,zz]=qz(full(a),full(b),'real');
0016 d=qq*d*u;
0017 i = 1;
0018 while i < m
0019 if t(i+1,i) == 0
0020 if i == 1
0021 c = zeros(n,1);
0022 else
0023 c = bb*(x(:,1:i-1)*t(1:i-1,i));
0024 end
0025 x(:,i)=(aa+bb*t(i,i))\(d(:,i)-c);
0026 i = i+1;
0027 else
0028 if i == n
0029 c = zeros(n,1);
0030 c1 = zeros(n,1);
0031 else
0032 c = bb*(x(:,1:i-1)*t(1:i-1,i));
0033 c1 = bb*(x(:,1:i-1)*t(1:i-1,i+1));
0034 end
0035 z = [aa+bb*t(i,i) bb*t(i+1,i); bb*t(i,i+1) aa+bb*t(i+1,i+1)]...
0036 \[d(:,i)-c;d(:,i+1)-c1];
0037 x(:,i) = z(1:n);
0038 x(:,i+1) = z(n+1:end);
0039 i = i + 2;
0040 end
0041 end
0042 if i == m
0043 c = bb*(x(:,1:m-1)*t(1:m-1,m));
0044 x(:,m)=(aa+bb*t(m,m))\(d(:,m)-c);
0045 end
0046 x=zz*x*u';
0047
0048
0049