calc_difference_data

PURPOSE ^

CALC_DIFFERENCE_DATA: calculate difference data between

SYNOPSIS ^

function dva = calc_difference_data( data1, data2, fwd_model)

DESCRIPTION ^

 CALC_DIFFERENCE_DATA: calculate difference data between
   two eidors data vectors
 dva = calc_difference_data( meas1, meas2, fwd_model)
   
  dva   = Matrix n_meas x n_time_steps of difference meas
  meas1 = measurement object (or matrix) at time1 (homogeneous)
  meas2 = measurement object (or matrix) at time2 (inhomogeneous)
  fwd_model (optional, if provided in meas1 and meas2)

  if data1==0, then just process data2 like absolute data

 This code appears simple, but there are a number of tricks
  to remember, so it is best to factor it out. Issues are
  1) normalize_data, 2) remove zero meas from adjacent systems,
  3) allow both raw data and eidors_obj formats for data

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function dva = calc_difference_data( data1, data2, fwd_model)
0002 % CALC_DIFFERENCE_DATA: calculate difference data between
0003 %   two eidors data vectors
0004 % dva = calc_difference_data( meas1, meas2, fwd_model)
0005 %
0006 %  dva   = Matrix n_meas x n_time_steps of difference meas
0007 %  meas1 = measurement object (or matrix) at time1 (homogeneous)
0008 %  meas2 = measurement object (or matrix) at time2 (inhomogeneous)
0009 %  fwd_model (optional, if provided in meas1 and meas2)
0010 %
0011 %  if data1==0, then just process data2 like absolute data
0012 %
0013 % This code appears simple, but there are a number of tricks
0014 %  to remember, so it is best to factor it out. Issues are
0015 %  1) normalize_data, 2) remove zero meas from adjacent systems,
0016 %  3) allow both raw data and eidors_obj formats for data
0017 
0018 % (C) 2006 Andy Adler. License: GPL version 2 or version 3
0019 % $Id: calc_difference_data.html 2819 2011-09-07 16:43:11Z aadler $
0020 
0021 data_width= max(num_frames(data1), num_frames(data2));
0022 
0023 try if data1.type == 'data'
0024    data1= data1.meas;
0025 end; end
0026 
0027 try if data2.type == 'data'
0028    data2= data2.meas;
0029 end; end
0030 
0031 if all(size(data1) == [1,1]) && (data1 == 0)
0032    dva =  filt_data( fwd_model, data2, data_width );
0033    return;
0034 end
0035 
0036 if ~isfield(fwd_model,'normalize_measurements')
0037    fwd_model.normalize_measurements = 0;
0038 end
0039 
0040 fdata1 = filt_data( fwd_model, data1, data_width );
0041 fdata2 = filt_data( fwd_model, data2, data_width );
0042 
0043 if fwd_model.normalize_measurements
0044    dva= fdata2 ./ fdata1 - 1;
0045 else   
0046    dva= fdata2 - fdata1;
0047 end
0048 
0049 function nf= num_frames(d0)
0050    if isnumeric( d0 )
0051       nf= size(d0,2);
0052    elseif strcmp( d0(1).type, 'data' );
0053       nf= length(d0);
0054    else
0055       error('Problem calculating number of frames');
0056    end
0057    
0058 % test for existance of meas_select and filter data
0059 function d2= filt_data(fwd_model, d0, data_width )
0060    if ~isnumeric( d0 )
0061        % we probably have a 'data' object
0062 
0063        l_obj = length(d0);
0064        d1 = zeros( length( d0(1).meas ), l_obj);
0065        for i=1:l_obj
0066           if strcmp( d0(i).type, 'data' )
0067               d1(:,i) = d0(i).meas;
0068           else
0069               error('expecting an object of type data');
0070           end
0071        end
0072 
0073    else
0074       % we have a matrix of data. Hope for the best
0075       d1 = d0;
0076    end
0077 
0078    d1= double(d1); % ensure we can do math on our object
0079 
0080    if isfield(fwd_model,'meas_select') && ...
0081      ~isempty(fwd_model.meas_select);
0082       % we have a meas_select parameter
0083 
0084       meas_select= fwd_model.meas_select;
0085       if     size(d1,1) == length(meas_select)
0086          d2= d1(meas_select,:);
0087       elseif size(d1,1) == sum(meas_select==1)
0088          d2= d1;
0089       else
0090          error('data size does not match meas_select');
0091       end
0092    else
0093       d2= d1;
0094    end
0095 
0096    if nargin==3 % expand to data width
0097       d2_width= size(d2,2);
0098       if d2_width == data_width
0099          % ok
0100       elseif d2_width == 1
0101          d2= d2(:,ones(1,data_width));
0102       else
0103          error('inconsistent difference data: (%d ~= %d)',  ...
0104                d2_width, data_width);
0105       end
0106    end
0107

Generated on Tue 09-Aug-2011 11:38:31 by m2html © 2005