【问题标题】:Replace +/- values around index - MATLAB替换索引周围的 +/- 值 - MATLAB
【发布时间】:2017-11-20 01:19:46
【问题描述】:

question 和我从中获得的宝贵帮助之后,我遇到了以下问题:

使用检测到的峰值索引并计算出这些峰值周围 +/-3 个数据点的信号中值,我需要将峰值周围 +/-5 窗口中的信号替换为先前计算的中值。

我只能用中值替换峰值处的数据点,而不是周围的 +/-5 数据点...见图。黑色 = 原始峰值;黄色 = 峰值处的数据点更改为周围 +/-3 个数据点的中位数。

Original peak and changed peak

很遗憾,按照上一个问题的建议,我无法使其工作。

任何帮助将不胜感激!

干杯, M

【问题讨论】:

  • 数据[idx-5:idx+5] = 中位数
  • @JLev:谢谢。不幸的是,我没有使用方括号...我尝试了以下方法: data(idx-5:idx+5) = median(data(idx-3:idx+3)) 无济于事。
  • 对不起,我的错,它确实是 () 而不是 []。没用是什么意思?你得到一个错误?结果不符合您的预期?
  • 实际上,我使用的代码有效,但仅适用于第一个值...关于如何执行所有索引的操作的任何建议?
  • 你能发布你的代码吗?

标签: arrays matlab


【解决方案1】:

假设您的意思如下。给定数组

x = [0 1 2 3 4 5 35 5 4 3 2 1 0]

你想用3,4,5,35,5,4,3的中位数替换35和周围的+/- 5个条目,即4,所以结果数组应该是

x = [0 4 4 4 4 4 4 4 4 4 4 4 0]

按照我在this question 中的回答,一种直观的方法是通过偏移索引来简单地用中值替换邻居。这可以按如下方式完成

[~,idx]=findpeaks(x);
med_sz = 3;    % Take the median with respect to +/- this many neighbors
repl_sz = 5;   % Replace neighbors +/- this distance from peak
if ~isempty(idx)
    m = medfilt1(x,med_sz*2+1);
    N = numel(x);
    for offset = -repl_sz:repl_sz
        idx_offset = idx + offset;
        idx_valid = idx_offset >= 1 & idx_offset <= N;
        x(idx_offset(idx_valid)) = m(idx(idx_valid));
    end
end

或者,如果你想避免循环,一个等效的无循环实现是

[~,idx]=findpeaks(x);
med_sz = 3;
repl_sz = 5;
if ~isempty(idx)
    m = medfilt1(x,med_sz*2+1);
    idx_repeat = repmat(idx,repl_sz*2+1,1);
    idx_offset = idx_repeat + repmat((-repl_sz:repl_sz)',1,numel(idx));
    idx_valid = idx_repeat >= 1 & idx_repeat <= numel(x);
    idx_repeat = idx_repeat(idx_valid);
    idx_offset = idx_offset(idx_valid);
    x(idx_offset) = m(idx_repeat);
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多