📄 ldlup.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ldlup.m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [L,d,p]=ldlup(L,d,j,g)% updates LDL^T factorization when a unit j-th row and column% are replaced by column g % if the new matrix is definite (signalled by p=[]);% otherwise, the original L,d and % a direction p of null or negative curvature are returned%% d contains diag(D) and is assumed positive% Note that g must have zeros in other unit rows!!!%function [L,d,p]=ldlup(L,d,j,g);p=[];test=0;if test, disp('enter ldlup') A=L*diag(d)*L';A(:,j)=g;A(j,:)=g'; end;n=size(d,1);I=1:j-1;K=j+1:n;if j==1, v=zeros(0,1); del=g(j); if del<=n*eps, p=[1;zeros(n-1,1)]; if test, A,p Nenner=abs(p)'*abs(A)*abs(p); if Nenner==0, indef1=0 ,else indef1=(p'*A*p)/Nenner, end; disp('leave ldlup at 1') end; return; end; w=g(K)/del; L(j,I)=v'; d(j)=del; if test, A1=L*diag(d)*L',A quot=norm(A1-A,1)/norm(A,1), disp('leave ldlup at 3') end; return; end;% now j>1, K nonemptyLII=L(I,I);u=LII\g(I);v=u./d(I);del=g(j)-u'*v;if del<=n*eps, p=[LII'\v;-1;zeros(n-j,1)]; if test, A,p indef1=(p'*A*p)/(abs(p)'*abs(A)*abs(p)) disp('leave ldlup at 2') end; return;end;LKI=L(K,I);w=(g(K)-LKI*u)/del;[LKK,d(K),q]=ldlrk1(L(K,K),d(K),-del,w);if isempty(q), % work around expensive sparse L(K,K)=LKK L=[L(I,:); v', 1,L(j,K); LKI,w,LKK]; d(j)=del; if test, A1=L*diag(d)*L',A quot=norm(A1-A,1)/norm(A,1), disp('leave ldlup at 4') end;else % work around expensive sparse L(K,K)=LKK L=[L(1:j,:); LKI,L(K,j),LKK]; pi=w'*q; p=[LII'\(pi*v-LKI'*q);-pi;q]; if test, indef2=(p'*A*p)/(abs(p)'*abs(A)*abs(p)), disp('leave ldlup at 5') end;end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -