たとえば、次のような信号があるとします。
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
か?
たとえば、次のような信号があるとします。
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
か?
元の質問への回答:正確なサブベクトル
を見つけるには、次を使用できます。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
あなたが言うように、ある種のコスト関数または尤度関数を使用する必要があります。開始する 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);