在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')
谢谢!
答案 0 :(得分:1)
您可以使用medfilt1
...
Xm=medfilt1(X,101);
这里不需要for循环...在我的旧笔记本电脑中,使用timeit需要一个1000长度的矢量大约6e-4秒:
f=@() medfilt1(X,101);
timeit(f)
这意味着1e5次需要~60秒。