在matlab中计算周期中值是否有效?

时间:2014-08-21 21:31:47

标签: matlab median

我正在使用matlab来模仿我编写的一些c代码,以便我可以复制结果并在matlab中绘制它。

在c中我使用的是一个链接here的开源滑动中值滤波器。

我目前正在使用medfilt1在matlab中模仿它,但有两个问题。

  1. 很慢!在matlab中使用类似的过滤器是理想的,但我不想花时间写一个。如果一个不存在,我想至少能够完成#2。

  2. medfilt1没有环绕。

    x = 1:5; medfilt1(x,3) % = 1 2 3 4 4

  3. 它计算第一个值,如

    median([0 1 2]) % = 1

    这是因为当你靠近边缘时,medfilt1使用零来填充。我想要一种方法来改变它,以便计算第一个值,如

    median([5 1 2]) % = 2

    medfiltcirc(x,3) % = 2 2 3 4 4
    

    更新:为了好玩,我在matlab中编写了一个滑动过滤器,结果比使用medarilt1和padarray慢了大约4倍。使用ordfilt2(padarray(x,[N/2 0],'circular'),N/2,ones(N,1))证明比medfilt1更快。我相信进一步提高速度的唯一方法是编写一个mex文件。

3 个答案:

答案 0 :(得分:3)

另一个选择是在使用中值过滤器之前使用padarray

x = medfilt1(padarray(1:5,[0 1],'circular'));

并以x(2:end-1)作为答案......

要改进medfilt1,请考虑使用ordfilt2,例如:

x =  ordfilt2(1:5,2,[1 1 1]);

这应该会让你最多花费两倍,阅读更多关于here的内容,并注意A使用的变量类......

答案 1 :(得分:1)

你可以自己包裹。将数据定义为

x = 1:5; %// data values
S = 3; %// block size

然后:

s = floor(S/2); %// how many elements need to be wrapped around
n = numel(x); %// length of x
result = medfilt1([x(n-s+1:n) x x(1:s)], S);
result = result(s+1:end-s);

答案 2 :(得分:0)

我确信你知道,循环统计数据可能是危险的 - from the Wikipedia article on directional statistics

  

当数据集中时,中位数和模式可以通过类比线性情况来定义,但对于更分散或多模态的数据,这些概念是无用的。

您是否查看过MathWorks文件交换中的Circular statistics Toolbox?它包含circ_median功能。我不知道这个函数与你使用的函数相比有多快,但它可能是优化的一个很好的起点。论文发表在工具箱上的Journal of Statistical Softwarealt link to PDF)。至少检查此函数是否与其他方法的输出匹配可能是个好主意。