在R2016a之前在MATLAB中移动中位数

时间:2016-07-05 18:01:10

标签: matlab median

在MATLAB R2016a中引入了函数movmedian,但我的版本较旧。

有没有人知道如何在不使用循环的情况下执行类似于此功能的操作?我需要多次调用此函数,速度很重要。

基本上,我有一个1000×1的向量X,我想要另一个向量,其中每个元素等于
Y(i)= median(X((i-50):(i+50)))。如果我使用循环,我可以这样做:

X=rand(1000,1);
Y=zeros(1000,1);

    for i=1:1000
        if i>=51
            start=i-50;
        else
            start=1;
        end
        if i<=950
            end1=i+50;
        else
            end1=1000;
        end
        Y(i)= median(X(start:end1));
    end

但是我会在每次迭代时用X改变内容(但不是大小)来调用这个循环1000到100,000次之后,我想看看我能做些什么更快的事情。

我尝试了medfilt1,除了我需要截断的系列以及我使用命令时它运行得很好:medfilt1(X,101,'truncate')我得到错误'输入参数必须是'double'。即使X是班级双!我甚至在Matlab webpage for this command中运行了确切的示例并得到了同样的错误。知道发生了什么事吗?我试过这个并得到了同样的错误:medfilt1(double(X),101,'truncate')

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用medfilt1 ...

例如,假设我有一个向量X,那么:

  Xm=medfilt1(X,101);

这里不需要for循环...在我的旧笔记本电脑中,使用timeit需要一个1000长度的矢量大约6e-4秒:

f=@() medfilt1(X,101);
timeit(f)

这意味着1e5次需要~60秒。