這是我的理解,你要確定svalue1
和svalue2
是彼此相似的價值觀是什麼,什麼是更重要的是,它們的長度不等。
你可以做什麼是svalue1
每個值與每一個價值svalue2
比較,如果在svalue1
和值svalue2
值之間的差值小於一定金額,那麼我們就這兩個要素進行分類是相同。
這可以通過bsxfun
與@minus
函數實現並消除與abs
任何符號更改。之後,我們可以確定這些值低於一定值的位置。
事情是這樣的:
tol = 0.5; %// Adjust if necessary
A = abs(bsxfun(@minus, svalue1(:), svalue2(:).')) <= tol;
[row,col] = find(A);
out = [row,col];
tol
是,我們會使用它來定義兩個值是否接近容差。我選擇這是0.5,但爲你的應用程序調整。 out
是一個2D矩陣,告訴您svalue1
中哪個值最接近svalue2
。我們只是向你展示這個工作的一個例子,而不是給出詳細的解釋,我們可以一路解釋。
讓我們來試試這一個例子:
>> svalue1 = [0 0.1 1 2.2 3];
>> svalue2 = [0.1 0.2 2 3 4];
運行上面的代碼中,我們得到:
>> out
ans =
1 1
2 1
1 2
2 2
4 3
5 4
現在,這是有道理的。每行都會告訴您svalue1
中的哪個值接近svalue2
。例如,第一行表示svalue1
中的第一個值或0接近svalue2
或0.1中的第二個值。下一行表示第二個值svalue1
或0.2與第一個值svalue2
或0相近。
顯然,此操作包括非唯一值。例如,[1 2]
和[2 1]
的行是相同的。我認爲這不是一個問題,所以我們會一個人離開。
現在我沒有覆蓋的是峯值是否也發生在同一時間值內。這可以通過對stime1
和stime2
的時間向量值執行另一個bsxfun
操作來完成,就像我們對svalue1
和svalue2
所做的那樣,並且在這兩個矩陣之間執行邏輯與運算。如果峯值在和的振幅和時間都相同,那麼結果如下....所以像這樣:
tol_amplitude = 5; %// Adjust if necessary
tol_time = 0.5;
A = abs(bsxfun(@minus, svalue1(:), svalue2(:).')) <= tol_amplitude;
Atime = abs(bsxfun(@minus, stime1(:), stime2(:).')) <= tol_time;
Afinal = A & Atime;
[row,col] = find(Afinal);
out = [row,col];
你會注意到我們有兩個閾值的時間和振幅。如有必要,調整兩者。 out
將包含像我們前面看到的結果,但這些會給你那些在和時間和振幅接近的指標。如果你想看看這些是什麼,你可以做這樣的事情:
peaks = [svalue1(out(:,1)) svalue2(out(:,2))];
times = [stime1(out(:,1)) stime2(out(:,2))];
peaks
和times
會給你什麼樣的相應的峯值和時間分別爲,將被視爲「關」兩個信號之間。第一列表示第一信號的峯值和時間,第二列表示第二信號的峯值和時間。列之間的差異應該小於規定的閾值。
謝謝@rayryeng,但時間很重要。所以例如我在時間10處有一個峯值,幅度爲100,在另一個矢量中,我在時間10.1處有一個峯值,幅度爲95 ..這意味着在時間和幅度幾乎相同時有交集。 – SMH
@SMH - 沒問題。我更新了我的帖子。看一看。 – rayryeng
@SMH - 我做了進一步的修改。注意到我的邏輯有缺陷。 – rayryeng