%L2depths Compute depths of PRMM from basis L. % % No known depths are exploited. These can be different because of noise % etc. % % Parameters: % opt.verbose(1) .. whether display info function [Mdepths, lambda] = L2depths(L, M, Idepths, opt) if nargin < 4, opt = []; end if ~isfield(opt,'verbose') opt.verbose = 1; end if opt.verbose, fprintf('Computing depths...'); tic; end Mdepths = M; [m n] = size(M); m = m/3; lambda(m, n) = 0; % memory allocation for j = 1:n full = find(~isnan(M(1:3:end,j))); mis_rows = intersect(find(Idepths(:,j)==0),full); if length(mis_rows) > 0 submatrix = spread_depths_col(M(k2i(full),j),Idepths(full,j)); % We want submatrix to be in the space L -> % we search for combination of columns of the base of L i.e. % L(k2i(full),:)*res(1:4)-submatrix*[1 res(5:length(res))] = 0 right = submatrix(:,1); A = [ L(k2i(full),:) -(submatrix(:,2:size(submatrix,2))) ]; if rank(A) < size(A, 2) % depths cannot be computed => kill the data kill = full(~Idepths(full,j)); Mdepths(k2i(kill),j) = NaN; lambda(kill,j) = NaN; else res = A \ right; %test: er should be near to zero %er=L(k2i(full),:)*res(1:4)-submatrix*[1 res(5:length(res))']' % depth corresponding to right is/are set to 1 i = full(find(right(1:3:end))); lambda(i,j) = 1; Mdepths(k2i(i),j) = M(k2i(i),j); for ii = 1:size(submatrix,2)-1 i = full(find(submatrix(1:3:end,1+ii))); lambda(i,j) = res(4+ii); Mdepths(k2i(i),j) = M(k2i(i),j)*lambda(i,j); end end end end if opt.verbose, disp(['(' num2str(toc) ' sec)']); end