1

我编写了一个算法来计算信号中过零的数量。我的意思是一个值从 + 变为 - 的次数,反之亦然。

算法解释如下:

如果有以下元素:

v1 = {90, -4, -3, 1, 3}

然后将该值乘以它旁边的值。(i * i+1)

然后取符号值 sign(val) 确定这是正数还是负数。例子:

e1 = {90 * -4} = -360 -> sigum(e1) = -1 
e2 = {-4 * -3} =  12  -> signum(e2) = 1
e3 = {-3 *  1} =  -3  -> signum(e3) = -1
e4 = {1 *   3} =  3   -> signum(e4) = 1

因此,从负数变为正数的值的总数为 = 2 ..

现在我想把这个论坛的算法放到一个方程中,这样我就可以呈现它了。

我问了一个类似的问题,但真的很困惑,所以离开并考虑了一下并想出了(我认为方程式应该是什么样子)..这可能是错误的,好吧,可笑的错误。但这里是:

在此处输入图像描述

现在它背后的逻辑:

我传入一个 V (val)

我通过计算 (Vi * Vi+1) 得到符号总和的绝对值。符号 (Vi * Vi+1) 应该产生 -1, 1, ..., 值

当且仅当值为 -1 时(因为我只对穿越零的次数感兴趣,因此,零值。

这看起来是否正确,如果不是,任何人都可以提出改进建议吗?

谢谢 :)!

编辑:

在此处输入图像描述

现在这正确吗?

4

1 回答 1

2

您在这里做的是正确的事情,但您的方程式是错误的,因为您只想在相邻元素的乘积为负数时计算它的符号。不要对产品的符号求和,因为应该忽略正号产品。出于这个原因,一个明确的数学公式是棘手的,因为相邻元素之间的正积应该被忽略。你想要的是一个函数,它接受 2 个参数,当它们的乘积为负时计算为 1,当它们的乘积为非负时计算为 0

f(x,y) = 1 if xy < 0
       = 0 otherwise

那么你的交叉点数由下式给出

sum(f(v1[i],v1[i+1])) for i = 0 to i = n-1 

其中n是向量/数组的长度v1(使用基于零索引的 C 样式数组访问表示法)。您还必须考虑边缘条件,例如 4 个连续点 {-1,0,0,1} - 您想将其视为简单的一个过零还是 2?只有您可以根据问题的具体情况来回答这个问题,但无论您的答案如何,都会相应地调整您的算法。

于 2012-11-22T00:17:40.010 回答