我有 X 作为 616 x 1 双倍。我使用以下方法计算了 X 的相邻元素之间的差异:
Y=diff(X);
并将 Y 作为 615 x 1 双精度数,包含正数和负数,包括 0(零)。
如果我正在使用
Y=diff>0;
我会得到 615 x 1 合乎逻辑的答案,这不是我期望的答案。
我的问题是
- 如何只提取 X 中差值为 0 的元素?
- 如何检测下降和上升趋势的开始位置?
我有 X 作为 616 x 1 双倍。我使用以下方法计算了 X 的相邻元素之间的差异:
Y=diff(X);
并将 Y 作为 615 x 1 双精度数,包含正数和负数,包括 0(零)。
如果我正在使用
Y=diff>0;
我会得到 615 x 1 合乎逻辑的答案,这不是我期望的答案。
我的问题是
如果您试图找到数值差异为零的条目,您可能会一无所获,因为所有条目的差异可能都是非零的,因为它们是double,并假设这 616 个条目是近似值。
我建议您可能想尝试设置一个容差Tol:例如
X = sin(linspace(0,2*pi,616)');
% this gives you an X being the grid approximation to sine
Y = diff(X);
Tol = 1e-2*2*pi/615;
indY = find(abs(Y) < Tol);
% the index of the difference vector that has absolute value < Tolerance
然后X(indY),X(indY+1)将给你X产生这些小于公差的差异的条目。如果后者大于前者,则X开始增加(近似),反之亦然。
MATLAB 给出:
>> X(indY)
ans =
0.99997
1
-0.99992
-1
>> X(indY+1)
ans =
1
0.99992
-1
-0.99997
选择的标准Tol更像是一个先验的猜测。首先你有我设置的间隔长度, 有网格点,其大小为1e2。的真导数是,其绝对值小于, 所以所有的数值差异应该小于或等于. 现在我已经知道正弦在其极值附近时会像线性函数一样增加或减少(想象泰勒展开式或小角度近似),并且需要大约 100 个网格才能使其达到最大值(先验地知道正弦)。因此,差的绝对值小于1e-2网格大小的倍数就足以说明,X几乎保持不变。它取决于问题。