3

私はのパッケージを持っておらず、この例nlfilterに完全には従いませんでした。

私は本当に単純な関数を持っていて、funそれを配列の移動ウィンドウに適用したいと思います。配列はです。たとえば、長さの間隔Nx1を確認したいと思います。kだからN=10と私は得るだろk=3fun = @(x) min(x);

A = [13 14 2 14 10 3 5 9 15 8];

filter(A,k,fun) = [2 2 2 3 3 3 5 8];

ここでは、インデックス1、2、3、2、3、4、...、8、9、10のみを確認したいので、最終的なシーケンスは長さ7です。これはforループで簡単に実行できますが、 Matlab用にベクトル化する方法がわかりません。助けてください。ありがとう。

4

2 に答える 2

6

これを行うための非常に簡単で迅速な方法の1つを次に示します。

>> min([A(1:(end-2)); A(2:(end-1)); A(3:end)], [], 1)

ans =

     2     2     2     3     3     3     5     8

編集:完全な機能が必要なので...

function running_min = running_min(x, k)

xrep = repmat(x, 1, k);
xrep = reshape([xrep zeros(1, k)], length(x)+1, k);
running_min = min(xrep, [], 2)';
running_min = running_min(1:end-k);
于 2011-11-02T01:28:16.697 に答える
4

あなたが言及した投稿は、スライディングウィンドウを構築するための一般的な解決策を提供しました(制御できます:オーバーラップと個別、スライドステップ、オーバーラップ量、ウィンドウサイズ)

あなたの場合、はるかに単純で、 HANKEL関数で簡単に実行できます。

x = [13 14 2 14 10 3 5 9 15 8];
idx = hankel(1:3, 3:length(x))
min( x(idx) )

再利用可能なソリューションを構築する場合:

function y = myFilter(x,k,fcn)
    idx = hankel(1:k, k:length(x));
    y = cellfun(fcn, num2cell(x(idx),1));
end

次のように使用します。

x = [13 14 2 14 10 3 5 9 15 8];
y = myFilter(x, 3, @(x)min(x))

fcnベクトル化された方法で次元全体を操作できない場合に備えて、CELLFUNを使用していることに注意してください...

于 2011-11-09T00:30:44.623 に答える