4

我需要在应用程序中使用这个 Kolmogorov 过滤器。您将一些测量数据放入其中,然后使用过滤器对其进行一些平滑处理。我尝试用“nchoosek”来做,但是当我尝试为 50 或更多的 I 做这个时,它需要的时间太长了。

在此处输入图像描述

有人知道如何以更快的方式做到这一点吗?

function [ filterd ] = kolmo(data, inter)
temp  = 0;
temp1 = 0;
filterd(1:10, 1) = NaN;

for t=inter+1:(length(data)-inter)
   for o=-inter:inter
    temp = temp + (nchoosek(2*inter, (inter+o))*data(t+o));

    temp1 = temp1 + nchoosek(2*inter, (inter+o));
   end

 filterd(t, 1) = temp/temp1;
 temp  = 0;
 temp1 = 0;
end

end

谢谢安迪

4

1 回答 1

4

这是一个无循环的解决方案:

function y = MySoln(x, K)

%# Get the binomial coefficient terms
FacAll = factorial(0:1:2*K)';
BinCoefAll = FacAll(end) ./ (FacAll .* flipud(FacAll));

%# Get all numerator terms
NumerAll = conv(x, BinCoefAll, 'valid');

%# Rescale numerator terms into output
y = (1 / sum(BinCoefAll)) * NumerAll;

我避免使用nchoosek,而是使用阶乘手动计算二项式系数。这确保了每个阶乘计算只执行一次。相比之下,OP 的解决方案可能会执行数百次阶乘计算。

一旦计算出二项式系数,就可以直接应用conv,然后按分母项进行缩放。

我在 OP 解决方案和我的解决方案之间进行了快速速度测试。x速度测试使用具有 50 个元素的随机向量,并设置K为 5。然后我100对我的解决方案与 OP 解决方案进行迭代。结果如下:

Elapsed time is 2.637597 seconds. %# OP Solution
Elapsed time is 0.010401 seconds. %# My Solution

我对此很满意。我怀疑从这一点上可以使该方法更加有效(但很高兴被证明是错误的)。:-)

于 2013-01-24T08:47:08.307 回答