【问题标题】:check alternation maxima minima in matlab在matlab中检查交替最大值最小值
【发布时间】:2014-09-09 22:22:12
【问题描述】:

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

[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 循环的有效方法吗?

提前致谢

【问题讨论】:

  • ID 是否保证具有整数值?
  • 是的,它们是整数
  • 很快我会给出答案。但是:在最小值的第 4 = 8 和第 5 = 16 位置之间有最大值,10 和 14。missing_min 应该是[6],你不同意吗?
  • 是的,我同意,我编辑了问题
  • 抱歉,实际上不,我不同意,因为第 5 位缺少最小值,因为第 5 位和第 6 位有 2 个连续的最大值

标签: matlab alternation minima


【解决方案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 内和跨 ID)。

后期编辑:

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

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

【讨论】:

  • 感谢您的回答,但这不是我想要的...我编辑了我的问题...我之前做了一些困惑..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2017-07-09
  • 1970-01-01
相关资源
最近更新 更多