Contents
Function WLIMIN: sequential recovery using weighted L1 minimization
WL1MIN recovers missing traces using weighted L1 minimization and utilizing the correlation between the support sets of the transform coefficients across partitions.
b - subsampled data volume mask - logical data volume indicating the locations of the missing data entries options: partOrder - specifies the proper permutation of the data volume so that partitioning is always performed along the first dimension st - index of the first partition fin - index of the last partition C - sparsifying transform maxiter - maximum number of spgl1 iterations omega - sets the weight used in weighted L1 minimization
function [Dest] = wL1min(b, mask, options)
% load the options and set defaults partOrder = getOption(options, 'partorder', [1 2 3]); % define the partition ordering st = getOption(options, 'st', 1); % index of first partition fin = getOption(options, 'fin', size(b,1)); % index of last partition C = getOption(options, 'transform', 1); % sparsifying transform maxiter = getOption(options, 'maxiter', 500); % maximum number of spql1 iterations omega = getOption(options, 'omega', 0.3); % initialize the weights
Permute the measurements
Permute the measurements so that partitioning is applied only across the first dimension
b = permute(b,partOrder); mask = permute(mask,partOrder); dim = size(b); x_prev=[]; opts.verbosity=1; opts.optTol = 1e-4; opts.bpTol = 1e-4; opts.iterations=maxiter; opts.weights = []; x_prev=[]; if fin > st incr = 1; else incr = -1; end
Loop over all partitions
for i=st:incr:fin if isempty(x_prev) % in the first iteration, recover using standard L1 minimization n = size(C,2); N = size(C,1); y = vec(b(i,:)); % build mask operator RM = opMask(dim(2)*dim(3),find(vec(mask(i,:)) > 0)); % measurement matrix A = RM*C'; sigma = 1e-4; W = ones(N,1); [x_l1] = spgl1(A, y, 0, sigma, zeros(N,1), opts); Dest(i,:,:) = reshape(C'*x_l1, dim(2), dim(3)); x_prev = C*C'*x_l1; else
% in subsequent iterations, recover using weighted L1 minimization n = size(C,2); N = size(C,1); y = vec(b(i,:)); % build mask operator RM = opMask(dim(2)*dim(3),find(vec(mask(i,:)) > 0)); % identify the support of the largest entries from the previous % partition as the support estimate [Cx Idx] = sort(abs(x_prev), 'descend'); ratCx = sqrt(cumsum(Cx.^2))/norm(Cx); k = find(ratCx(1:end) >= 0.9); T = Idx(1:k(1)); Tc = setdiff([1:N]',T);
Build the weight vector
use small weights on the support estimate and a weight equal to one outside of the support estimate
W = ones(N,1); W(T) = omega; % measurement matrix A = RM*C'; sigma = 1e-4; % run weighted L1 minimization opts.weights = W; [x_wl1] = spgl1(A, y, 0, sigma, zeros(N,1), opts); Dest(i,:,:) = reshape(C'*x_wl1, dim(2), dim(3)); x_prev = C*C'*x_wl1;
end end