ivan@77: function data = completeOps(data) ivan@77: ivan@77: % Copyright 2008, Ewout van den Berg and Michael P. Friedlander ivan@77: % http://www.cs.ubc.ca/labs/scl/sparco ivan@77: % $Id: completeOps.m 1040 2008-06-26 20:29:02Z ewout78 $ ivan@77: ivan@77: operators = {}; ivan@77: flagM = 0; if isfield(data,'M'), flagM = 1; end; ivan@77: flagB = 0; if isfield(data,'B'), flagB = 1; end; ivan@77: ivan@77: if (~flagM) && (~flagB) ivan@77: error('At least one of the operators M or B has be to given.'); ivan@77: end ivan@77: ivan@77: % Define measurement matrix if needed ivan@77: if ~flagM ivan@77: info = data.B([],0); ivan@77: data.M = opDirac(info{1}); ivan@77: else ivan@77: operators{end+1} = data.M; ivan@77: end ivan@77: ivan@77: % Define sparsity basis if needed ivan@77: if ~flagB ivan@77: info = data.M([],0); ivan@77: data.B = opDirac(info{2}); ivan@77: else ivan@77: operators{end+1} = data.B; ivan@77: end ivan@77: ivan@77: % Define operator A if needed ivan@77: if ~isfield(data,'A') ivan@77: if (length(operators) > 1) ivan@77: data.A = opFoG(operators{:}); ivan@77: else ivan@77: data.A = operators{1}; ivan@77: end ivan@77: end ivan@77: ivan@77: % Define empty solution if needed ivan@77: if ~isfield(data,'x0') ivan@77: data.x0 = []; ivan@77: end ivan@77: ivan@77: % Define the operator size and string ivan@77: opInfo = data.A([],0); ivan@77: data.sizeA = [opInfo{1},opInfo{2}]; ivan@77: opInfo = data.B([],0); ivan@77: data.sizeB = [opInfo{1},opInfo{2}]; ivan@77: opInfo = data.M([],0); ivan@77: data.sizeM = [opInfo{1},opInfo{2}]; ivan@77: data.op.strA = opToString(data.A); ivan@77: data.op.strB = opToString(data.B); ivan@77: data.op.strM = opToString(data.M); ivan@77: ivan@77: % Get the size of the desired signal ivan@77: if ~isfield(data,'signalSize') ivan@77: if ~isfield(data,'signal') ivan@77: error(['At least one of the fields signal ', ... ivan@77: 'or signalSize must be given.']); ivan@77: end ivan@77: data.signalSize = size(data.signal); ivan@77: end ivan@77: ivan@77: % Reconstruct signal from sparse coefficients ivan@77: if ~isfield(data,'reconstruct') ivan@77: data.reconstruct = @(x) reshape(data.B(x,1),data.signalSize); ivan@77: end ivan@77: ivan@77: % Reorder the fields (sort alphabetically) ivan@77: m = fieldnames(data); ivan@77: m = sort(m); ivan@77: dataReorder = struct(); ivan@77: for i=1:length(m) ivan@77: eval(sprintf('dataReorder.%s = data.%s;',m{i},m{i})); ivan@77: end ivan@77: ivan@77: data = dataReorder;