MATLAB: определить максимумы и минимумы и соответственно разделить данные - PullRequest
0 голосов
/ 22 октября 2018

У меня есть следующие массивы:

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 голосов
/ 22 октября 2018

Для такой проблемы вы должны рассмотреть возможность использования Matlab's 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

, которое, я считаю, близко к тому, что вы хотите.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...