4

ハイ

アプリケーションでこのコルモゴロフ フィルターを使用する必要があります。いくつかの測定データを入力し、フィルターを使用して滑らかにします。「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

Thxアンディ

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、代わりに階乗を使用して手動で二項係数を計算しました。これにより、各階乗計算が 1 回だけ実行されることが保証されます。対照的に、OP のソリューションは、各階乗計算を何百回も実行する可能性があります。

二項係数が計算されると、そこからの解は を直接適用convし、分母の項でスケーリングします。

OPソリューションと私のソリューションの間で簡単な速度テストを行いました。速度テストでは、 x50 要素のランダム ベクトルを使用し、 K5 に設定します。次に100、ソリューションと OP ソリューションに対して反復を実行します。結果は次のとおりです。

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

これにはかなり満足しています。この時点から、この方法をはるかに効率的にできるとは思えません (ただし、間違っていることが証明されれば幸いです)。:-)

于 2013-01-24T08:47:08.307 に答える