Как найти ближайшее значение времени к заданному значению времени в Matlab

Скажем, у меня есть заданное значение времени, например: 2012-03-28_15:10:00, а затем у меня есть строка, которая хранит несколько значений времени:

2012-03-28_14:00:00
2012-03-28_14:10:00
2012-03-28_14:20:00
2012-03-28_14:30:00
2012-03-28_14:40:00
2012-03-28_14:50:00
2012-03-28_15:00:00
2012-03-28_15:05:00
2012-03-28_15:20:00
2012-03-28_15:30:00

Я хочу найти значение времени в строке, наиболее близкое к исходному значению времени. Кто-нибудь знает, как это можно сделать в матлабе?


person user3366536    schedule 24.03.2014    source источник
comment
2012-03-28_15:10:00 - это массив символов? А как насчет списка, это символьная матрица?   -  person Divakar    schedule 24.03.2014
comment
@Divakar Да, извините, 2012-03-28_15:10:00 - это массив символов, а список - это матрица символов.   -  person user3366536    schedule 24.03.2014
comment
Я бы сделал «min(abs(t-t0))», где «t0» — это то, что вы хотите найти. Если ваши векторы времени представляют собой строки, вы должны сначала преобразовать их в числовой формат.   -  person remus    schedule 24.03.2014


Ответы (1)


Код

data1 = '2012-03-28_15:10:00'
data2 = [
'2012-03-28_14:00:00'
'2012-03-28_14:10:00'
'2012-03-28_14:20:00'
'2012-03-28_14:30:00'
'2012-03-28_14:40:00'
'2012-03-28_14:50:00'
'2012-03-28_15:00:00'
'2012-03-28_15:05:00'
'2012-03-28_15:20:00']

[~,ind1] = min(abs(datenum(data2)-datenum(data1)));
closest_time = data2(ind1,:)

Вывод

closest_time =

2012-03-28_15:05:00

Расширенная часть. Если у вас много дат, в том числе в виде символьной матрицы и для сравнения со списком, то использование подхода bsxfun может быть лучшим решением, поскольку оно позволяет избежать циклов. Это показано ниже -

Код

data1 = [
'2012-03-28_14:02:00'
'2012-03-28_14:11:00'
'2012-03-28_14:23:00'
'2012-03-28_14:32:00']

data2 = [
'2012-03-28_14:00:00'
'2012-03-28_14:10:00'
'2012-03-28_14:20:00'
'2012-03-28_14:30:00'
'2012-03-28_14:40:00'
'2012-03-28_14:50:00'
'2012-03-28_15:00:00'
'2012-03-28_15:05:00'
'2012-03-28_15:08:00']

[~,ind1] = min(abs(bsxfun(@minus,datenum(data2),datenum(data1)')));
closest_time = data2(ind1,:)

Вывод

closest_time =

2012-03-28_14:00:00
2012-03-28_14:10:00
2012-03-28_14:20:00
2012-03-28_14:30:00
person Divakar    schedule 24.03.2014
comment
В чем преимущество использования bsxfun вместо datenum(data2)-datenum(data1)? - person remus; 24.03.2014
comment
@remus Ты прав! bsxfun это перебор для этого? :) - person Divakar; 24.03.2014
comment
@user3366536 user3366536 Посмотрите Extended Part в ответе о том, почему и где bsxfun может быть весело :) - person Divakar; 24.03.2014
comment
@user3366536 user3366536 Также кажется, что вы не приняли некоторые из ваших предыдущих вопросов, включая этот (если он ответил на ваш вопрос). Stackoverflow утверждает это - Accepting an answer is not meant to be a definitive and final statement indicating that the question has now been answered perfectly. It simply means that the author received an answer that worked for him or her personally... Подробнее об этом можно прочитать здесь — stackoverflow.com/help/accepted-answer. - person Divakar; 24.03.2014