определить отставание между двумя векторами

Я хочу найти минимальное отставание между двумя векторами, я имею в виду минимальное расстояние, на котором что-то повторяется в векторе на основе другого, например, для

x=[0 0 1 2 2 2 0 0 0 0]
y=[1 2 2 2 0 0 1 2 2 2]

Я хочу получить 4 для x до y и получить 2 для y до x .

Я обнаружил функцию finddelay(x,y), которая правильно работает только для x до y (она дает -4 для y до x).

есть ли какая-нибудь функция, которая дает мне отставание только в том случае, если я иду в правильном направлении вектора? Я буду так благодарен, если вы не против помочь мне получить этот результат


person Community    schedule 20.11.2017    source источник
comment
Я не очень понимаю в вашем примере, как вы можете получить 2, сравнивая задержку между y и x...? если вы сделаете +2 для каждого индекса y, вы не получите x   -  person Dadep    schedule 20.11.2017
comment
нет, это не ... если вы рассматриваете вектор x, он имеет 1 на третьем месте.. Мне нужна функция, которая учитывает каждый в векторе x (в реальном сигнале у меня их больше) и вычисляет расстояние от первого 1, который произошел после 1 по y (например, здесь это произойдет на 4 шага позже, что на седьмом месте по y), тогда у нас должно быть другое расстояние для большого сигнала, и я хочу, чтобы они были минимальными   -  person    schedule 20.11.2017


Ответы (1)


Я думаю, что это может быть потенциальная ошибка в finddelay. Обратите внимание на этот отрывок из документации (выделено мной):

X и Y не обязательно должны быть точными задержанными копиями друг друга, поскольку finddelay(X,Y) возвращает оценку задержки посредством взаимной корреляции. Однако эта предполагаемая задержка имеет полезное значение только в том случае, если существует достаточная корреляция между задержанными версиями X и Y. Также, если возможны несколько задержек, как в случае периодических сигналов, возвращается задержка с наименьшим абсолютным значением. В случае, если и положительная, и отрицательная задержка с одинаковым абсолютным значением возможно, возвращается положительная задержка.

Казалось бы, это означает, что finddelay(y, x) должно возвращать 2, тогда как на самом деле оно возвращает -4.

РЕДАКТИРОВАТЬ:

Похоже, это проблема, связанная с ошибками с плавающей запятой, вызванными xcorr, как я описываю в мой ответ на этот связанный вопрос. Если вы наберете type finddelay в командном окне, вы увидите, что finddelay использует xcorr внутри. Даже когда входными данными для xcorr являются целые значения, результаты (которые, как вы ожидаете, также должны быть целыми значениями) могут в конечном итоге содержать ошибки с плавающей запятой, из-за которых они будут немного больше или меньше целочисленного значения. Затем это может изменить индексы, в которых будут расположены максимумы. Решение состоит в том, чтобы округлить вывод от xcorr, когда вы знаете, что все ваши входные данные являются целыми значениями.

Лучшей реализацией finddelay для целочисленных значений может быть что-то вроде этого, что фактически вернет задержку с наименьшим абсолютным значением:

function delay = finddelay_int(x, y)
  [d, lags] = xcorr(x, y);
  d = round(d);
  lags = -lags(d == max(d));
  [~, index] = min(abs(lags));
  delay = lags(index);
end

Однако в своем вопросе вы просите вернуть положительные задержки, которые не обязательно будут наименьшими по абсолютному значению. Вот другая реализация finddelay, которая правильно работает для целочисленных значений и отдает предпочтение положительным задержкам:

function delay = finddelay_pos(x, y)
  [d, lags] = xcorr(x, y);
  d = round(d);
  lags = -lags(d == max(d));
  index = (lags <= 0);
  if all(index)
    delay = lags(1);
  else
    delay = lags(find(index, 1)-1);
  end
end

И вот различные результаты для вашего тестового примера:

>> x = [0 0 1 2 2 2 0 0 0 0];
>> y = [1 2 2 2 0 0 1 2 2 2];
>> [finddelay(x, y) finddelay(y, x)]  % The default behavior, which fails to find 
                                      %   the delays with smallest absolute value
ans =

     4    -4

>> [finddelay_int(x, y) finddelay_int(y, x)]  % Correctly finds the delays with the
                                              %   smallest absolute value
ans =

    -2     2

>> [finddelay_pos(x, y) finddelay_pos(y, x)]  % Finds the smallest positive delays

ans =

     4     2
person gnovice    schedule 20.11.2017
comment
большое спасибо за ваш ответ. кажется, что finddelay([0 y], [0 x]) даст мне правильный результат для y до x, но опять же, если я использую это как finddelay([0 x], [0 y]), это даст мне - 2 (но я хочу 4) - person ; 20.11.2017
comment
что мне делать, так как я работаю с большим количеством этих векторов и не могу проверить их по отдельности - person ; 20.11.2017
comment
х=[0 0 1 2 2 2 0 0 0 0 1 2 2 2 0 0 1 2 2 2 0 0 0 0 1 2 2 2]; у=[1 2 2 2 0 0 1 2 2 2 0 0 0 1 2 2 2 0 0 0 0 0 0 1 2 2 2 0]; для этого от x до y я хочу 3 и от y до x 1 - person ; 20.11.2017
comment
@FaribaJangjoo: я не уверен, что это лучший подход. Я думал, может быть, что-то основано на conv, но это не сработало для всех тестовых случаев. Вы могли бы взглянуть на то, что finddelay на самом деле делает с type finddelay. Может быть, это поможет. - person gnovice; 20.11.2017
comment
Я не уверен, что это ошибка. Я думаю это из-за несоответствия x и y в конце векторов. Если вы задержите y на 2, два последних элемента будут [1 2], а в x это [ 0 0]. Таким образом, Matlab дает задержку -4, так что векторы будут равны после задержки. Попробуйте: x = [0 0 1 2 2 2 0 0 1 2]; finddelay(y, x), и вы получите 4 - person Adiel; 21.11.2017