matlab找到diff等于零的元素

计算科学 matlab
2021-12-13 06:29:23

我有 X 作为 616 x 1 双倍。我使用以下方法计算了 X 的相邻元素之间的差异:

Y=diff(X);

并将 Y 作为 615 x 1 双精度数,包含正数和负数,包括 0(零)。

如果我正在使用

Y=diff>0;

我会得到 615 x 1 合乎逻辑的答案,这不是我期望的答案。

我的问题是

  • 如何只提取 X 中差值为 0 的元素?
  • 如何检测下降和上升趋势的开始位置?
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更像是一个先验的猜测。首先你有我设置的间隔长度2π, 有616网格点,其大小为1e2的真导数sinxcosx,其绝对值小于1, 所以所有的数值差异应该小于或等于h=2π/615. 现在我已经知道正弦在其极值附近时会像线性函数一样增加或减少(想象泰勒展开式或小角度近似),并且需要大约 100 个网格才能使其达到最大值(先验地知道正弦)。因此,差的绝对值小于1e-2网格大小的倍数就足以说明,X几乎保持不变。它取决于问题。