Вычитание и интерполяция фона на постоянной основе - PullRequest
0 голосов
/ 16 октября 2018

Мне нужен ваш опыт для решения проблемы.У меня есть следующая матрица с разными столбцами.

Time            subsamp raw     filt_BG filter
230.5382060     1       1       1       0
230.5382176     2       1       1       0
230.5382292     1       4       0       1
230.5382407     2       4       0       1
230.5382523     1       3       0       1
230.5382639     2       3       0       1
230.5382755     1       2       1       0
230.5382870     2       2       1       0
230.5382986     1       2       0       1
230.5383102     2       2       0       1
230.5383218     1       1       0       1
230.5383333     2       1       0       1
230.5383449     1       3       1       0
230.5383565     2       3       1       0

Она содержит два разных типа необработанных данных (столбец 3).Каждый тип необработанных данных не имеет одинакового номера.подвыборки (столбец 2).«Filter_BG» и «фильтр» разделяют тип данных.Я пытаюсь объяснить проблему и требуемое решение с помощью следующей диаграммы.enter image description here На приведенной выше диаграмме (слева) необработанные данные представлены в виде функции времени.Цвета представляют разные окна (подвыборки) 'sig' и 'BG' на основе 'filter' и 'filter_BG', соответственно.Я хочу выполнить интерполяцию из окна «BG1» в окно «BG2» (от выборки до выборки), чтобы интерполированные данные можно было вычитать (от выборки до выборки) из «sig1» и «sig2».Аналогично от «BG2» до «BG3» интерполяция и вычитание из «sig3» и «sig4».Это дает мне «solution1» (вверху справа).Теперь, если «BG3» не существует, я хочу использовать только «BG2» для вычитания из «sig3» и «sig4» (решение2, внизу справа).Матрица решения будет выглядеть примерно так.Спасибо за ваши идеи / решение. !!!Пожалуйста, имейте в виду, что у меня будут миллионы точек данных, не таких простых, как описано здесь.Кроме того, у меня нет набора инструментов, а есть только доступный matlab.Любое решение, основанное на наборе инструментов, тоже подойдет.

Time            subsamp solution1   solution2   
230.5382060     1       NaN         NaN
230.5382176     2       NaN         NaN
230.5382292     1       2.5         2.5
230.5382407     2       2.5         2.5
230.5382523     1       1.5         1.5
230.5382639     2       1.5         1.5
230.5382755     1       NaN         NaN
230.5382870     2       NaN         NaN
230.5382986     1       -0.5        0
230.5383102     2       -0.5        0
230.5383218     1       -1.5        -1
230.5383333     2       -1.5        -1
230.5383449     1       NaN         NaN
230.5383565     2       NaN         NaN 

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете использовать cumsum для вычисления точек выборки и запросов для интерполяции, а данные можно интерполировать с помощью interp1 .В случае отсутствия данных BG (необработанные данные содержат NaN) необходимо добавить первые и последние действительные необработанные данные в начало и конец, чтобы interp1 мог генерировать требуемые экстраполяции.

idxsig = data(:,5)==1;                         % logical index to sig
idxBG  = (data(:,4)==1) & (~isnan(data(:,3))); % logical index to BG   

f1 = find(idxBG,1,'first');
f2 = find(idxBG,1,'last');
                                               % Add the first and the last-
                                               % valid data to the beginning-
                                               % and the end of raw data to-
                                               % get valid extrapolation                           
sig = data(idxsig,3);
BG = [data(f1,3);data(idxBG,3);data(f2,3)];
idxBG =  [true ;idxBG; true];
idxsig = [false; idxsig; false];
                                               % preparing sample and query-
                                               % points for interpolation
idx_sum = cumsum(idxBG);                          
idx_sig = idx_sum(idxsig)+0.5;                 % query points
idx_BG = idx_sum(idxBG);                       % sample points
intr = sig - interp1(idx_BG, BG, idx_sig);
solution = NaN(size(idxBG));
solution(idxsig) = intr                        % reformat to the original size
solution = solution(2:end-1);

solution =

       NaN
       NaN
   2.50000
   2.50000
   1.50000
   1.50000
       NaN
       NaN
  -0.50000
  -0.50000
  -1.50000
  -1.50000
       NaN
       NaN
...