在曲线MATLAB中找出增加和减少的趋势

时间:2012-07-19 11:58:21

标签: matlab

a=[2 3 6 7 2 1 0.01 6 8 10 12 15 18 9 6 5 4 2].

这是一个数组,我需要提取开始增加和减少趋势的确切值。

数组a的输出将为[2(first element) 2 6 9]

a=[2 3 6 7 2 1 0.01 6 8 10 12 15 18 9 6 5 4 2].
   ^       ^        ^               ^
   |       |        |               |

请帮助我在MATLAB中获得任何类似类型数组的结果..

2 个答案:

答案 0 :(得分:5)

您只需找到连续数字之间差异的符号变化的位置。 通过一些常识和函数diffsignfind,您可以获得此解决方案:

a = [2 3 6 7 2 1 0.01 6 8 10 12 15 18 9 6 5 4 2];
sda = sign(diff(a));
idx = [1 find(sda(1:end-1)~=sda(2:end))+2 ];
result = a(idx);

编辑:

当两个连续的数字相同时,符号函数会混淆,因为sign(0) = 0被错误地识别为趋势变化。你必须过滤掉这些。您可以通过首先从原始数据中删除连续的重复项来完成此操作。由于您只想要趋势变化开始的值,而不是实际开始的位置,这是最简单的:

a(diff(a)==0) = [];

答案 1 :(得分:1)

这是使用diff功能的好地方。

您的第一步将是执行以下操作: B = [0 diff(a)]

我们添加0的原因是由于diff函数的工作方式,使矩阵保持相同的长度。它将从矩阵中的第一个元素开始,然后报告它与下一个元素之间的差异。在第一个元素之前没有前导元素,因此只是将矩阵截断一个元素。我们加零,因为它没有变化,因为它是起始元素。

如果你看一下B中的结果,现在很明显拐点在哪里(从正数变为负数)。

要以编程方式解决这个问题,您可以执行许多操作。我倾向于使用一点乘法和find命令。

Result = find(B(1:end-1).*B(2:end)<0)

这将返回您在拐点的尖端的索引。在这种情况下,它将是:

ans =

     4     7    13