【问题标题】:Is there an efficient was to calculate a cyclical median in matlab?在matlab中计算循环中位数是否有效?
【发布时间】:2014-08-21 21:31:47
【问题描述】:

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

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

我目前在matlab中使用medfilt1进行模拟,但是有两个问题。

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

  2. medfilt1 不回绕。

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

它计算第一个值,如

median([0 1 2]) % = 1

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

median([5 1 2]) % = 2

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

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

【问题讨论】:

    标签: matlab median


    【解决方案1】:

    另一种选择是在使用中值滤波器之前使用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的变量类...

    【讨论】:

    • 如果你打算使用medifit1的第二个参数,使用n=3;a=1:5;x = medfilt1(padarray(a,[0 (n-1)/2],'circular'),n);x=x((n-1)/2+1:end-(n-1)/2);
    • 是的,这将是一般的解决方案,我相信 OP 足够聪明,可以让他自己\她自己......
    • 谢谢,我希望得到一些不需要计算额外中位数的东西(我使用的是长度为 2048 的过滤器),但这解决了问题
    • 为了获得最大效率,您还可以考虑直接使用 ordfilt2 调用的ordf.mex64...
    【解决方案2】:

    你可以自己做环绕。让数据定义为

    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);
    

    【讨论】:

    • 此解决方案不仅仅需要环绕,在这种情况下,每侧环绕 1 个元素就足够了。
    • 嘿,你是对的!我后来添加了,3 并没有想到这一点。接得好!现已更正
    • 感谢@Luis,与接受类似的解决方案,但是,使用 padarray 可以防止索引噩梦。
    • @Trogdor 是的,padarray 似乎更易于使用
    【解决方案3】:

    我相信你知道,循环统计可能是危险的——from the Wikipedia article on directional statistics:

    当数据集中时,中位数和众数可以类比线性情况来定义,但对于比较分散或多模态的数据,这些概念就没有用了。

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

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 2018-04-21
      • 2018-10-31
      • 1970-01-01
      相关资源
      最近更新 更多