It turns out to be easier than I thought. Given V such that A*V=V*E we find any W such that [W,V] is invertible and if A*W = W*F+V*G (i.e. [W,V]\A*[W,V] = [E,0;F,G] then setting U=W-V*X we solve the Sylvester equation E*X-X*F=G using lyap() and [U,V] block-diagonalizes A.
Block diagonalize a matrix
11 次查看(过去 30 天)
显示 更早的评论
Given a square matrix A and a rectangular matrix V, how do we find a complement U such that [U,V]\A*[U,V] is block diagonal?
For simplicity assume that V does not break any Jordan chains (i.e. v is in the span of V if and only if Av is in the span of V) so that the block sizes correspond to the number of columns of U and V. Here it would be enough to find a U such that [U,V] is invertible and A*U=U*C for some matrix C.
An interesting example that arises in probability theory is to calculate the limit B=(t-1)*inv(tI-A) as t->1 where A has a complete set of eigenvectors for 1. Considering the Jordan form of the matrix, A=W*blkdiag(J,I)/W, where 1 is not in eig(J), it's not hard to show that B=W*blkdiag(O,I)/W where O=zeros(size(J)). However the Jordan form is not numerically stable and we don't need all of it anyway.
The approach I'd prefer to use is to calculate V=null(A-I) and find the complement U that block diagonalizes A, which gives a similar expression for B.
Small example:
A=[0,0,0;1/2,1,0;1/2,0,1];
% Jordan method (works for small examples):
[W,J]=jordan(A);
J(J~=1 | ~eye(size(J)))=0;
B = W*J/W; % here B=A
% Block diagonalization (computed partly by hand, wish to generalize):
V=null(A-eye(size(A)));
U=[1;-1/2;-1/2]; % in general U=???
B=[U,V]*diag([zeros(1,size(U,2)),ones(1,size(V,2))])/[U,V]; % here B=A
0 个评论
回答(1 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Linear Algebra 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!