📄 fullpathgreedyfb.m
字号:
function [subres,sol,vars,rhobreaks,res]=FullPathGreedyFB(A,S,k,depth,algo)% Given decomposition, compute full greedy path% Warning: diagonal of S should be decreasing!% DEBUG: sol and rhobreaks should be fixed% Process inputsn=size(S,1);if nargin<3 k=n-1;else k=min(k,n-1);endif nargin<4 depth=0;endif nargin<5 algo=0;end% Initialize pathsubset=[1];subres=[subset';zeros(n-length(subset),1)];res=[];rhobreaks=[sum(A(:,1).^2)];sol=[];vars=[];% Initialize forward/backward search paramsi=1;iback=1;dirct=1; % Scan pathwhile i<=k if dirct<0 % Go backward if algo==0 % Approx greedy algo % Compute solution at current subset [v,mv]=maxeig(S(subset,subset)); vsol=zeros(n,1);vsol(subset)=v; % Compute x at current subset x=A(:,subset)*v;x=x/norm(x); res=[res,x]; % Compute next rho breakpoint set=1:n;set(subset)=[]; vals=(x'*A(:,subset)).^2; [rhomax,vpos]=min(vals); rhobreaks(end)=[];sol=sol(:,1:end-1);vars(end)=[]; subset(vpos)=[];subres=[subres(:,1:end-2),[subset';zeros(n-length(subset),1)]]; iback=iback-1; else % Use pure greedy algo instead subres=subres(:,1:end-2); vbuf=[]; for j=1:length(subset) bufset=subset;bufset(j)=[]; [v,mv]=maxeig(S(bufset,bufset)); vbuf=[vbuf;mv]; end [m,idx]=max(vbuf);vars(end)=[]; subset(min(idx))=[];subres=[subres,[subset';zeros(n-length(subset),1)]]; iback=iback-1; end else % Go forward if algo==0 % Approx greedy algo % Compute solution at current subset [v,mv]=maxeig(S(subset,subset)); vsol=zeros(n,1);vsol(subset)=v; sol=[sol,vsol];vars=[vars,mv]; % Compute x at current subset x=A(:,subset)*v;x=x/norm(x); res=[res,x]; % Find point to remove set=1:n;set(subset)=[]; vals=(x'*A(:,set)).^2; [rhomax,vpos]=max(vals); rhobreaks=[rhobreaks;rhomax]; subset=[subset,set(vpos)];subres=[subres,[subset';zeros(n-length(subset),1)]]; iback=iback+1; else % Use pure greedy algo instead [v,mv]=maxeig(S(subset,subset)); vars=[vars,mv]; set=1:n;set(subset)=[];vbuf=[]; for j=set bufset=union(subset,j);[v,mvbuf]=maxeig(S(bufset,bufset)); vbuf=[vbuf;mvbuf]; end [mv,idx]=max(vbuf); subset=[subset,set(min(idx))];subres=[subres,[subset';zeros(n-length(subset),1)]]; iback=iback+1; end end %txt=fprintf('i: %d iback: %d #vars: %d',i,iback,length(vars));disp(txt); if (depth>0)&(i>=3) if iback>i % Control search direction i=i+1;dirct=-1; elseif iback<=max(i-depth,2) dirct=1; end else i=i+1; endendif k==n-1 [v,mv]=maxeig(S); vars=[vars,mv];end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -