检查matlab中的交替最大值最小值

时间:2014-06-25 13:12:21

标签: matlab alternation minima

我编写了一个算法,可以在信号中找到局部最大值和最小值。

[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_max missing_min,表示缺少的最大值和最小值的位置。

id_min (id_max)中的两个连续最小值(最大值)之间没有最大值(最小值)时,最大值(最小值)丢失。

在此示例中,id_max的第7个位置缺少最大值,因为在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标记缺失值)

如果交替正确,则矢量应为空。你可以建议一个有效的方法来做到这一点没有for循环?

提前致谢

1 个答案:

答案 0 :(得分: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);

ID上的注意事项:

  1. 确保您的id_minid_max是行(即使为空);
  2. 确保其中至少有一个不为空;
  3. 虽然不需要对它们进行排序,但它们的值必须是唯一的(在ID内和跨越)。
  4. 稍后编辑:

    新版本的代码,基于有关定义的新解释:

        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个元素是否具有相同的值)