卡尔莫戈洛夫滤波器Matlab实现

4

我需要在一个应用程序中使用 Kolmogorov 滤波器。您可以将一些测量数据输入其中,并使用滤波器进行平滑处理。我尝试使用 "nchoosek" 进行操作,但是当 I 大于等于 50 时,处理时间太长。

enter image description here

有人知道如何更快地完成这个过程吗?

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

Thx Andy


1
嗯,如果这是关于优化代码的话,发布代码可能是个好主意。 - KlausCPH
这是你的代码中经常调用的函数吗?当它被调用时,I始终相同吗? - RussH
1
йҰ–е…ҲиҰҒеҒҡзҡ„жҳҜеңЁеҶ…йғЁеҫӘзҺҜдёӯж¶ҲйҷӨдёӨдёӘзӣёеҗҢзҡ„еҜ№nchoosek(2*inter, (inter+o))зҡ„и°ғз”Ёд№ӢдёҖгҖӮ - KlausCPH
我已经更新了我的答案,删除了任何循环,并确保每个阶乘计算仅执行一次。我猜这一点已经非常接近最优了。 - Colin T Bowers
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解决方案和我的解决方案之间进行了快速速度测试。速度测试使用一个具有50个元素的随机向量x,并将K设置为5。然后我运行100次迭代,对比我的解决方案和OP解决方案。以下是结果:
Elapsed time is 2.637597 seconds. %# OP Solution
Elapsed time is 0.010401 seconds. %# My Solution

我对此感到非常满意。我怀疑从这个点上,方法不可能变得更加高效(但如果被证明是错误的,我会很高兴)。:-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接