Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R2016a之前在MATLAB中移动中值_Matlab_Median - Fatal编程技术网

R2016a之前在MATLAB中移动中值

R2016a之前在MATLAB中移动中值,matlab,median,Matlab,Median,在MatlabR2016a中引入了该函数,但我有一个更旧的版本 有人知道如何在不使用循环的情况下执行类似于此函数的操作吗?我需要多次调用这个函数,速度很重要 基本上,我有一个1000×1的向量X,我想要另一个向量,其中每个元素等于 Y(i)=中值(X((i-50):(i+50))。如果我使用循环,我可以这样做: X=rand(1000,1); Y=zeros(1000,1); for i=1:1000 if i>=51 start=i-50

在MatlabR2016a中引入了该函数,但我有一个更旧的版本

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

基本上,我有一个1000×1的向量
X
,我想要另一个向量,其中每个元素等于
Y(i)=中值(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=rand(1000,1);
Y=零(1000,1);
对于i=1:1000
如果i>=51
开始=i-50;
其他的
开始=1;
结束
如果我你可以用

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

  Xm=medfilt1(X,101);
这里不需要for循环。。。在我的旧笔记本电脑中,使用timeit需要1000个长度向量,大约6e-4秒:

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

这意味着1次5次需要约60秒。

您是否有测试来支持您的断言,即循环是算法中的限制因素?我可能遗漏了一些东西,但
中值(X(I-50):X(I+50))
中值(X(I-1):X(I+1)不一样吗
?循环比其他函数慢在很大程度上取决于MATLAB版本和函数的编写方式。我建议您创建一些函数,稍后再考虑优化。太好了,回到我最初的问题,您是否有测试来支持您的断言,即循环是算法中的限制因素?是什么您当前的算法??如果您有信号处理工具箱,您可以使用。否则,如果您有图像处理工具箱,您可以使用并选择邻域高度1。第三种方法是使用
gallery('circul',X)
,选择适当的列,并取行的中间值。一个更有趣的方法是实现专门的移动窗口插入排序。谢谢Bla,我很感激。我添加了一个关于medfilt1问题的编辑。你能给AddPlease一个最小的代码来说明你的问题吗(X有多大等)我在帖子中的代码展示了一个非常接近的例子。向量X大约有1000个元素,我将调用这个函数1000到100000次。对于100000个不同的X向量?是的,X向量在每次迭代中都会改变,但大小保持不变。