⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dualvalue.m

📁 稀疏PCA的优化解算法
💻 M
字号:
function [dv,tv]=dualvalue(A,S,rho,pattern)% Computes dual value for a given rho and a pattern (when basic consitency condition is satisifed)tv=[];ds=diag(S);if any(ds(1:end-1)-ds(2:end)<0)    disp('Error in dualvalue input: diagonal of input matrix should be decreasing');    dv=0;tv=[];return;endif norm(A'*A-S)>1e-12;    disp('Error in dualvalue input: A not factor of S');    dv=0;tv=[];return;    endn = size(S,1);set=1:n;set(pattern)=[];if length(pattern)==1    dv=S(1,1)-rho;tv=[1;zeros(n-1,1)];return;end% build x and v[v,mv]=maxeig(S(pattern,pattern));x = A(:,pattern) * v;v = v / norm(x);x = x / norm(x);temp = S(:,pattern)*v;if isempty(set)    rhomin_active = 0;else    rhomin_active =  max( temp(set).^2 );endrhomax_active=min( temp(pattern).^2 );if rhomin_active >= rhomax_active    % No possible rhos, exit    dv = Inf;    return;end% Check rhoif (rho<rhomin_active-1e-6)|(rho>rhomax_active+1e-6)    disp('Error in computing dual value: inconsistent rho');    dv = Inf;    return;end% Otherwise, build dual solution matrix as a function of rhoMtest=zeros(size(S));pr=find(diag(S-rho)>0);prset=intersect(pr,set);if length(prset)>0%     for j=prset%         prjx=A(:,j)-(x'*A(:,j))*x;%         Mtest=Mtest+rho*((A(:,j)'*A(:,j)-rho)/(rho-(A(:,j)'*x)^2))*prjx*prjx'/(prjx'*prjx);%     end%     for i=pattern%         bix=A(:,i)*A(:,i)'*x-rho*x;%         Mtest=Mtest+bix*bix'/(x'*bix);%     end    Ap=A(:,prset)-x*x'*A(:,prset); % same as above but faster...    Mtest=Ap*diag(rho*(sum(A(:,prset).^2)-rho)./(sum(Ap.^2).*(rho-(x'*A(:,prset)).^2)))*Ap';    Bix=A(:,pattern)*diag(x'*A(:,pattern))-rho*x*ones(1,length(pattern));    Mtest=Mtest+Bix*diag(1./(x'*Bix)')*Bix';    [tv,dv]=maxeig(Mtest); % NUMISSUE: Nan when rho is close to the boundaryelse % All other variables can be excluded right away    Bix=A(:,pattern)*diag(x'*A(:,pattern))-rho*x*ones(1,length(pattern));    Mtest=Mtest+Bix*diag(1./(x'*Bix)')*Bix';    [tv,dv]=maxeig(Mtest); % NUMISSUE: Nan when rho is close to the boundaryend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -