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

📄 wtlsap.m

📁 加权总体最小二乘matlab工具箱
💻 M
字号:
function [p,info,dh] = wtlsap(d,w,m,opt)% WTLSAP - Weighted Total Least Squares approximation% by alternating projections (Algorithm 2.1).%% [p,info,dh] = wtlsap(d,w,m,opt)%% D = [d1 ... dN] - data matrix, sd := size(D,1)% W - sd x N weight matrix (EWTLS problem), %     sd x sd x N tensor (WTLS problem), or %     sd.N x sd.N weight matrix for vec(d) (FWTLS)% m    - complexity specification, m < sd% OPT  - options for the optimization algorithm, see OPTIMSET%   OPT.MAXITER - maximum number of iterations %   OPT.TOLFUN  - convergence tolerance for the function value  %   OPT.P0      - user defined initial approximation % P    - parameter of an image representation of the WTLS model% INFO - structure containing exit information:%   INFO.M    - WTLS misfit%   INFO.TIME - execution time%   INFO.ITER - number of iterations performed%   Note: INFO.ITER = OPT.MAXITER indicates lack of convergence% DH   - WTLS data approximation tic % measure the execution time% Constants[sd,N] = size(d);sdm    = sd*m;% Which case?switch size(w,2) case N  c = 1; case sd  c = 2; case sd*N  c = 3;end% Default parametersif nargin > 3  if isempty(opt.MaxIter)    opt.MaxIter = 1000;  end  if isempty(opt.TolFun)    opt.TolFun = 1e-10;  end  % Compute initial approximation if not given  if isfield(opt,'p0')     p = opt.p0;    [M,dh] = mwtlsp(d,w,p);    elseif isfield(opt,'P0')     p = opt.P0;    [M,dh] = mwtlsp(d,w,p);  else    [r,p,M,dh] = wtlsini(d,w,m);  endelse  opt = optimset('Display','off');    opt.TolFun  = 1e-10;  opt.MaxIter = 1000;  [r,p,M,dh]  = wtlsini(d,w,m);endl = zeros(m,N); % reserve memory for L% Main iteration loopcont = 1;iter = 0;while (cont)  % Solve the relaxation problems with a special method  % depending on the weight matrix structure   if c == 1 % EWTLS    % Solve RLX1    for i = 1:N      wip = w(:,i*ones(1,m)) .* p;      l(:,i) = (p'*wip)\wip'*d(:,i);    end    % Solve RLX2    A  = zeros(sdm);    b  = zeros(sdm,1);    for k = 1:N      wk  = w(:,k);      for i = 1:m        for j = 1:m          A((i-1)*sd+1:i*sd,(j-1)*sd+1:j*sd) = diag( ...              diag(A((i-1)*sd+1:i*sd,(j-1)*sd+1:j*sd)) ...              + l(i,k) * l(j,k) * wk);        end        b((i-1)*sd+1:i*sd) = b((i-1)*sd+1:i*sd) + ...            l(i,k) * (wk .* d(:,k));      end    end    p  = reshape(A\b,sd,m);       elseif c == 2 % WTLS    % Solve RLX1    for i = 1:N      ptwi = p' * w(:,:,i);       l(:,i) = (ptwi*p)\ptwi*d(:,i);    end    % Solve RLX2    A = zeros(sdm);    b = zeros(sdm,1);    for k = 1:N      wk = w(:,:,k);      for i = 1:m        for j = 1:m          A((i-1)*sd+1:i*sd,(j-1)*sd+1:j*sd) = ...              A((i-1)*sd+1:i*sd,(j-1)*sd+1:j*sd) + ...              l(i,k) * l(j,k) * wk;        end        b((i-1)*sd+1:i*sd) = b((i-1)*sd+1:i*sd) + ...            l(i,k) * wk * d(:,k);      end    end    p  = reshape(A\b,sd,m);       else % FWTLS    % Solve RLX1    bp = kron(eye(N),p);    vl = (bp'*w*bp)\bp'*w*d(:);    l  = reshape(vl,m,N);    % Solve RLX2    bl = kron(l',eye(sd));    vp = (bl'*w*bl)\bl'*w*d(:);    p  = reshape(vp,sd,m);  end    % Display  iter  = iter + 1;  Mold  = M;  dh    = p*l;  M     = mwtlsdh(d,w,dh);  switch lower(opt.Display)   case 'iter'    fprintf('%2d : Misfit = %18.16f\n',k,M)  end      % Exit condition  rerr  = abs(M-Mold)/M;  cont = (iter < opt.MaxIter) & (rerr > opt.TolFun); endinfo.M    = M;info.iter = iter;info.time = toc;

⌨️ 快捷键说明

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