-1

たとえば、次のような信号があるとします。

x = [1 2 9 16 18 19 18 16 9 7 4 2 1 1 0 0];

そして、信号の位置を見つけたい:

y = [10 8 4 3 1];

これは に近く[9 7 4 2 1]、この例ではn = 9です。

どうやって見つけることができますnか?

4

2 に答える 2

5

元の質問への回答:正確なサブベクトル
を見つけるには、次を使用できます。findstr

n = findstr(y, x)

改訂された質問への回答:最も近い一致するサブシグナル
を見つけるには、次を使用できます。conv2

M = conv2(A(:), flipud(B(:)), 'valid');
NA = conv2(A(:) .^ 2, ones(size(B(:))), 'valid');
NB = round(norm(B(:)) ^ 2);
D1 = abs(NA - NB);
D2 = abs(M .^ 2 - NA * NB);
idx = find(D1 == min(D1));
n = idx(find(D2(idx) == min(D2(idx)), 1))

これは、振幅とエネルギー相関の両方を考慮した経験的測定基準に依存しています。
ほとんどの場合、かなり正確に機能します。この例では、次の結果が正しく得られます。

n =

    9
于 2012-07-06T10:55:19.833 に答える
4

あなたが言うように、ある種のコスト関数または尤度関数を使用する必要があります。開始する for ループは次のとおりです。コスト関数を自分で見つけさせます。

x = [1 2 9 16 18 19 18 16 9 7 4 2 1 1 0 0];
y = [10 7 4 3 1];

cor = 9999;
n=0;
for i=1:(length(x)-length(y))

    % Complete this line to check if x matches y at this point
    score = SomeFunctionChecking( x(i : (i+length(y)-1) ),  y ));

    if (score < cor)
        cor = score;
        n = i;
    end
end

display(n);
于 2012-07-06T11:08:30.570 に答える