通过匹配尽可能接近的非相同数字来过滤 table 行 Matlab

Filter table rows Matlab by matching non-identical numbers as close as possible

这可能比我目前的方法更简单,所以欢迎任何建议!

我有一个 MATLAB table (38327x17) char/double 变量从 .csv 导入,readtable()doublechar。 col 2 中的 double 变量是采样率约为 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; ...]

我想通过向量过滤 table,有效地对 table 时间点进行下采样,即通过与向量中每个时间点最匹配的时间点提取 table 的 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 文件并进行字符串匹配,但似乎效率低下。

您可以最小化两个时间向量之间的“外部差异”(有更好的名称吗?),大小:

% 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 MB,因此该算法应该没问题。