У меня есть два списка временных меток, и я пытаюсь создать карту между ними, которая использует imu_ts как истинное время и пытается найти ближайшее к нему значение vicon_ts. Результатом является матрица 3xd, где первая строка — это индекс imu_ts, третья строка — это время unix для этого индекса, а вторая строка — это индекс ближайшего значения vicon_ts над отметкой времени в том же столбце.
Вот мой код, и он работает, но очень медленно. Я не уверен, как его векторизовать.
function tmap = sync_times(imu_ts, vicon_ts)
tstart = max(vicon_ts(1), imu_ts(1));
tstop = min(vicon_ts(end), imu_ts(end));
%trim imu data to
tmap(1,:) = find(imu_ts >= tstart & imu_ts <= tstop);
tmap(3,:) = imu_ts(tmap(1,:));%Use imu_ts as ground truth
%Find nearest indecies in vicon data and map
vic_t = 1;
for i = 1:size(tmap,2)
%
while(vicon_ts(vic_t) < tmap(3,i))
vic_t = vic_t + 1;
end
tmap(2,i) = vic_t;
end
Временные метки уже отсортированы в порядке возрастания, так что это, по сути, операция O(n), но из-за того, что она зациклена, она выполняется медленно. Любые векторизованные способы сделать то же самое?
Изменить Похоже, что он работает быстрее, чем я ожидал или измерял сначала, так что это больше не критическая проблема. Но мне было бы интересно посмотреть, есть ли хорошие решения этой проблемы.