我有两个带有速度和方向数据的数据集,用不同的时间步记录。
每10分钟记录一个数据集(A
),每小时记录另一个数据集(B
)。
开始时间不完全相同。
A
(速度和方向数据)进行采样,例如00.00,00.10,00.20,...
B
(方向数据)进行采样,例如23.54,00.54,01.54,......
我想创建一个新版本的数据集B
,其中包含基于数据集A
的方向数据(一种合成数据集),其中我每10分钟填写一次记录数据集A
并保持每小时数据集B的原始记录。
示例数据:
% columns: timestamp, direction, speed
A = [732381.006944445 22.70 2.23
732381.013888889 18.20 3.41
732381.020833333 31.00 6.97
732381.027777778 36.90 5.63];
% columns: timestamp, direction
B = [732381.038078704 3.01
732381.079745370 5.63
732381.121412037 0.68
732381.163078704 359.56];
..我想要这样的东西..
% columns: timestamp, direction
B_new = [732381.038078704 'some value based on value in A at that time'
732381.079745370 'some value based on value in A at that time'
732381.121412037 'some value based on value in A at that time'
732381.163078704 'some value based on value in A at that time'];
因此B_new
矩阵中的第一列是10分钟的时间戳,而不是一小时的原始时间戳。 IE浏览器。我们创建一个新的时间序列(B_new
),采样时间为10分钟。所以像你这样的东西已经显示@Wolfie,但是时间矩阵是A
。
在B
中将方向数据指定为A
中最接近的可用时间的方向数据的最佳方法是什么,同时仍然在新矩阵中保持与A相同的数据采样{{1 }}?
答案 0 :(得分:1)
使用interp1
(表查找功能)很容易实现。
内插到较慢的采样
假设您为此演示提供了一些不错的干净数据A
和B
...
% Columns: time (0.1s timestep), data (just the row number)
A = [ (1:0.1:2); (1:11) ].';
% Columns: time (1.0s timestep), data (doesn't even matter, to be removed)
B = [ (1:1:2); rand(1,2) ].';
现在我们使用interp1
从A
获取最接近的数据值(就时间列而言)并将其分配给B_new
。
B_new = zeros(size(B)); % Initialise
B_new(:,1) = B(:,1); % Get time data from B
% Get nearest neighbour by specifying the 'nearest' method.
% Using 'extrap' means we extrapolate if B's times aren't contained by A's
B_new(:,2) = interp1(A(:,1), A(:,2), B_new(:,1), 'nearest', 'extrap');
% Output
disp(B_new)
% >> [ 1 1
% 2 11 ]
% This is as expected, because 1 and 11 are the values at t = 1 and 2
% in the A data, where t = 1 and 2 are the time values in the B data.
插入更高的采样
我们也可以做相反的事情。您建议您想要获取一些基本数据A
,并填写B
(或最接近的匹配项)的点数。
B_new = A; % Initialise to fast sample data
% Get row indices of nearest neighbour (in time) by using interp1 and mapping
% onto a list of integers 1 to number of rows in A
idx = interp1(A(:,1), 1:size(A,1), B(:,1), 'nearest', 'extrap');
% Overwrite those values (which were originally from A) with values from B
B_new(idx,2) = B(:,2);