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中获得任何类似类型数组的结果..
答案 0 :(得分:5)
您只需找到连续数字之间差异的符号变化的位置。 通过一些常识和函数diff,sign和find,您可以获得此解决方案:
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