4
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 中为任何类似类型的数组获取结果..

4

2 回答 2

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) = [];
于 2012-07-19T12:17:14.163 回答
1

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

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

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

如果您现在查看结果,B很明显拐点在哪里(从正数到负数的位置)。

要以编程方式将其拉出来,您可以做很多事情。我倾向于使用一点乘法和find命令。

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

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

ans =

     4     7    13
于 2012-07-19T12:19:48.093 回答