Arrays 替换+;/-索引周围的值-MATLAB

Arrays 替换+;/-索引周围的值-MATLAB,arrays,matlab,Arrays,Matlab,在这之后,我从中得到了宝贵的帮助,我已经解决了以下问题: 使用检测到的峰值指数并计算出这些峰值周围+/-3个数据点的中值,我需要用先前计算的中值替换峰值周围+/-5窗口中的信号 我只能用中值替换峰值处的数据点,但不能替换周围+/-5个数据点…见图。黑色=原始峰值;黄色=峰值处的数据点变为其周围+/-3个数据点的中值 不幸的是,我未能通过遵循关于上一个问题的建议来实现这一目标 任何帮助都将不胜感激 干杯, M假设你的意思如下。给定数组 x = [0 1 2 3 4 5 35 5 4 3 2 1

在这之后,我从中得到了宝贵的帮助,我已经解决了以下问题:

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

我只能用中值替换峰值处的数据点,但不能替换周围+/-5个数据点…见图。黑色=原始峰值;黄色=峰值处的数据点变为其周围+/-3个数据点的中值

不幸的是,我未能通过遵循关于上一个问题的建议来实现这一目标

任何帮助都将不胜感激

干杯,
M

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

x = [0 1 2 3 4 5 35 5 4 3 2 1 0]
您希望用
3,4,5,35,5,4,4,3
的中位数替换
35
及其周围的+/-5个条目,即
4
,因此生成的数组应为

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

按照我的答案,用一种直观的方法,就是通过偏移标记,简单地用中值替换邻居。这可以通过以下方式实现

[~,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);
N=努美尔(x);
对于偏移量=-repl_sz:repl_sz
idx_offset=idx+offset;

idx\u有效=idx\u偏移量>=1&idx\u偏移量数据[idx-5:idx+5]=median@JLev:谢谢。不幸的是,我没有使用方括号。。。我尝试了以下方法:data(idx-5:idx+5)=median(data(idx-3:idx+3))无效。对不起,我的错,它实际上是()而不是[]。你说没用是什么意思?你有错误吗?结果不是你所期望的?事实上,我使用的代码是有效的,但只适用于第一个值。。。关于如何执行al索引的操作,您有什么建议吗?可以发布您的代码吗?
[~,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