这是我的理解,你要确定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