Проверить чередование максимумов минимумов в Matlab

Я написал алгоритм, который находит локальные максимумы и минимумы в сигнале.

[id_max, id_min] = find_max_min(signal);

Я хотел бы сейчас проверить: соблюдается ли изменение максимумов и минимумов

i.e. id_max(1)<id_min(1)<id_max(2)<id_min(2)<... 
we could start with a minimum..this is not known

Предположим, что:

 id_max = [1 3 5 7 10 14 20];

 id_min = [2 4 6 8 16 19];

Я хотел бы иметь 2 вектора missing_maxmissing_min с указанием местоположения недостающих максимумов и минимумов.

Отсутствие максимума (минимума) происходит, когда между двумя последовательными минимумами (максимумами) в id_min (id_max) там не максимум (минимум).

В этом примере максимум отсутствует в седьмой позиции id_max, потому что в id_min есть два последовательных значения (16 19) без максимума между ними.

Тогда у нас есть

missing_max = [7]

missing_min = [5]

поскольку

id_max = [1 3 5 7 10 14 X 20];

id_min = [2 4 6 8 X 16 19]; (с помощью X I отмечены пропущенные значения)

Если чередование правильное, векторы должны быть пустыми. Можете ли вы предложить эффективный способ сделать это без петель?

заранее спасибо

1 ответ

Решение

Вот скрипт, который вы можете адаптировать к функции, если хотите:

    id_max = [1 3 5 7 10 14 20];
    id_min = [2 4 6 8 16 19];

    % Group all values, codify extremity (1-max, 0-min), and position
    id_all   = [          id_max,              id_min  ];
    code_all = [ones(size(id_max)), zeros(size(id_min))];
    posn_all = [  1:numel(id_max),     1:numel(id_min) ];

    % Reshuffle the codes and positions according to sorted IDs of min/max
    [~, ix]  = sort(id_all);
    code_all = code_all(ix);
    posn_all = posn_all(ix);

    % Find adjacent IDs that have the same code, i.e. code diff = 0
    code_diff = (diff(code_all)==0);

    % Get the indices of same-code neighbors, and their original positions
    ix_missing_min = find([code_diff,false] & (code_all==1));
    ix_missing_max = find([code_diff,false] & (code_all==0));

    missing_min    = posn_all(ix_missing_min+1);
    missing_max    = posn_all(ix_missing_max+1);

Предостережения по идентификаторам:

  1. Убедитесь, что ваш id_min а также id_max являются строками (даже если они пустые);
  2. Убедитесь, что хотя бы один из них не пуст;
  3. Хотя их не нужно сортировать, их значения должны быть уникальными (в пределах идентификаторов и между ними).

Позже отредактируйте:

Новая версия кода, основанная на новых пояснениях к определению:

    id_max = [1 3 5 7 10 14 20];
    id_min = [2 4 6 8 16 19];
    %id_max = [12 14]
    %id_min = [2 4 6 8 10];

    id_min_ext = [-Inf, id_min];
    id_max_ext = [-Inf, id_max];

    % Group all values, and codify their extremity (1-max, 0-min), and position
    id_all   = [          id_max_ext,              id_min_ext  ];
    code_all = [ones(size(id_max_ext)), zeros(size(id_min_ext))];
    posn_all = [  0:numel(id_max),         0:numel(id_min)     ];

    % Reshuffle the codes and position according to sorted positions of min/max
    [~, ix] = sort(id_all);
    code_all = code_all(ix);
    posn_all = posn_all(ix);

    % Find adjacent IDs that have the same code, i.e. code diff = 0
    code_diff = (diff(code_all)==0);

    % Get the indices of same-code neighbours, and their original positions
    ix_missing_min = find([code_diff,false] & (code_all==1));
    ix_missing_max = find([code_diff,false] & (code_all==0));

    missing_min    = unique(posn_all(ix_missing_min-1))+1;
    missing_max    = unique(posn_all(ix_missing_max-1))+1;

Тем не менее, код содержит небольшую ошибку. Ошибка будет устранена либо человеком, который задал вопрос, либо мной, после того как он / она улучшит вопрос таким образом, чтобы было действительно ясно, о чем он спрашивал. :-) Из-за того, что у нас есть 2 виртуальных экстремума (один максимум и одна минута, при ID = −∞), возможно, что первый отсутствующий экстремум будет отмечен дважды: один раз в −∞ и один раз в первом элементе ID список. unique() позаботится об этом (хотя это слишком много вызова функции, чтобы проверить, имеют ли первые 2 элемента массива одинаковое значение)

Другие вопросы по тегам