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