Фильтровать строки таблицы Matlab, сопоставляя неидентичные числа как можно ближе

Это может иметь более простое решение, чем мой текущий подход, поэтому приветствуются любые рекомендации!

У меня есть таблица MATLAB (38327x17) переменных char/double, импортированных из .csv с readtable(), double преобразованными из char. Переменная double в столбце 2 представляет собой временные точки с частотой дискретизации около ~ 0,02 секунды, выглядит примерно так:

char double char char char etc.  
x 1.0088 y w z  
x 1.0218 y w e  
x 1.1017 w y z  
x 1.1287 w q z  

У меня также есть вектор точек времени (238x1) с частотой дискретизации 2,531 секунды:

[0; 2.531; 5.062; 7.593; ...]

Я хочу отфильтровать таблицу по вектору, эффективно понижая временные точки таблицы, т.е. извлекать 238 строк таблицы по временным точкам, которые лучше всего соответствуют каждой временной точке в векторе.

Желаемый результат:

char double char char char etc.  
x 0 y w z  
x 2.7816 y w e  
x 5.0607 w y z  
x 7.6064 w q z  

(где значения максимально приближены к вектору, но не совпадают тождественно из-за несовпадения интервалов выборки). Я пробовал resample() и downsample(), но далеко не продвинулся. Я мог бы перебирать CSV-файл построчно и сопоставлять строки, но это кажется неэффективным.


person Coco Newton    schedule 18.03.2021    source источник


Ответы (1)


Вы можете минимизировать внешнюю разницу (есть ли для этого лучшее название?) по величине между двумя векторами времени:

% Create example data
v=(0:60).'*2.531; %column vector
M=(1:ceil(v(end)/0.49))*0.49;
chars='a':'z';
M=table( repmat('x',[numel(M) 1]), M.', chars(mod(randperm(numel(M)),numel(chars))+1).', ...
  'VariableNames', {'char1', 'double1', 'char2'} );

% Find desired rows
[~,idx]=min(abs( M.double1 - v.' )); %relies on implicit expansion
M(idx,:),

В вашем случае временная матрица с различиями будет 38327 x 238, или около 70 МБ, так что этот алгоритм должен подойти.

person Vicky    schedule 18.03.2021
comment
супер элегантное решение, спасибо!! - person Coco Newton; 19.03.2021