MATLAB:确定最大值和最小值并相应地拆分数据

时间:2018-10-22 04:02:26

标签: matlab sorting

我有以下数组:

x = [1:33]; 
y = [0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 0 1 2 1 0 1 2 3 4 3 2 1 0];

我需要将y分成不同的部分。我需要获取升序部分,降序部分以及组合的升序和降序部分。

例如:

 Ascending parts = [1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 1
 1 1 1 0 0 0 0]; 

 Descending parts = [0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1
 1 1 1 1 0 0  1 1 0 0 0 0 1 1 1 1]; 

 Combined parts = [1 1 1 1 1 1 1 1 1
 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 4 4 4 4 4 4 4 4];

我当然可以对这些数组手动执行此操作,但是我需要对具有成千上万个点的数组执行此操作,并且希望自动执行。我一直在使用findpeaks函数,但这并不是一帆风顺的,因为它有时会在下降/上升部分而不是终点采集峰值。

有关如何执行此操作的任何提示?

版本MATLAB 2017 / b

1 个答案:

答案 0 :(得分:1)

对于这样的问题,您应该考虑使用Matlab的diff

对于y = [0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 0 1 2 1 0 1 2 3 4 3 2 1 0];

a=diff(y)
1   1   1   1   1   -1  -1  -1  -1  -1  1   1   1   1   1   -1  -1  -1  -1  -1  1   1   -1  -1  1   1   1   1   -1  -1  -1  -1

b=a, c =a;
b(b<0)=0;
c(c>0)=0;

会给你:

b = 1   1   1   1   1   0   0   0   0   0   1   1   1   1   1   0   0   0   0   0   1   1   0   0   1   1   1   1   0   0   0   0

c = 0   0   0   0   0   -1  -1  -1  -1  -1  0   0   0   0   0   -1  -1  -1  -1  -1  0   0   -1  -1  0   0   0   0   -1  -1  -1  -1

对于第二部分,您可以执行以下操作:

z=diff(y, 2);
zd=[0 find(z~=0);0 z(find(z~=0))]

0     5    10    15    20    22    24    28    32
0    -2     2    -2     2    -2     2    -2     2

假设您的函数通常如此,上面的模式将显示序列中的凸凹区域。在这种假设下,以下情况适用于您的情况:

za=[0 zd(1,zd(2,:)>0)];
zad=diff(za);
cell2mat(arrayfun(@(x,y) repelem(x,y), 1:length(zad),zad,'UniformOutput',false))

ans: 1  1   1   1   1   1   1   1   1   1   2   2   2   2   2   2   2   2   2   2   3   3   3   3   4   4   4   4   4   4   4   4

我相信它接近您想要的。希望这会有所帮助。