Count the number of trend changes in a vector.
2 ビュー (過去 30 日間)
古いコメントを表示
I need to count the number of times a vector increases/decreases. E.g
vec = [0 0 1 2 4 4 2 0 1 2 3]
diff(vec)
ans =
[0 1 1 2 0 -2 -2 1 1 1]
would evidently yield 4 trend changes. I don't wish to count the zero as a trend.
Tips please!
Update:
If you were to plot(vec) it's easier to see what I mean. I wish to simply count the number of row changes in the plot. A flat line (derivative of 0) isn't considered a row change in my application.
Take this as an example:
vec = [3 3 3 5 5 4 3 2 4 5 5 5];
plot(vec)
As you can see from the plot, it's 4 row changes (even though it's 8 in pure diff).
Update:
Ok, I'll try to do better.
Imagine a matrix that describes position over time, where row is position and column is time. When going in a straight line (along a single row) I wish to do nothing. But when changing course over to another row-line I wish to count each new "course" as an occurrence.
E.g
- Travelling at row 5 and then moving up to row 6 and then going straight, that's one course change.
- [5 5 5 6 6 6] => 1 "course change"
- Travelling at row 5 and then moving up to row 7 is similarly one change.
- [5 5 5 7 7 7] => 1 "course change"
- Travelling at row 5, moving up to 7 and then directly back to row 6 is then two changes.
- [5 5 5 7 6 6 6] => 2 "course changes"
- Travelling at row 5, moving up to 7 and then to 12 and then going straight is two changes as the row increment is 2 and then 5 (not a straight course).
- [5 5 5 7 12 12 12] => 2 "course changes"
So basically I wish to count each time you change position (or row) in a straight course.
4 件のコメント
Jan
2012 年 7 月 16 日
Please, Sebastian, add informations, which are necessary to define the question, by editing the question, not as comment.
採用された回答
Andrei Bobrov
2012 年 7 月 16 日
編集済み: Andrei Bobrov
2012 年 7 月 16 日
EDIT
a = diff(vec(:));
out = nnz(unique(cumsum([true;diff(a)~=0]).*(a~=0)));
5 件のコメント
Andrei Bobrov
2012 年 7 月 17 日
編集済み: Andrei Bobrov
2012 年 7 月 17 日
Hi Sebastian! Thank you for "Accepted..".
Let
vec = [-3 -2 3 3 2 0 0 1 2 5]';
Our goal is to determine the number of groups of identical nonzero elements located near in a:
a = diff(vec);
In our case: out = 6.
t - indexs of all groups (with zeros's groups).
t = cumsum([true;diff(a)~=0]);
non-zero elements in a:
t1 = t(a~=0); % or t1 = cumsum([true;diff(a)~=0]).*(a~=0);
index of groups with none-zero element ( t21 ):
t21 = unique(t1); % or t22 = unique(cumsum([true;diff(a)~=0]).*(a~=0));
and lost:
out1 = numel(t21); % or out2 = nnz(unique(cumsum([true;diff(a)~=0]).*(a~=0)));
その他の回答 (2 件)
Doug Hull
2012 年 7 月 12 日
You would need to remove the zeros from the first diff vector and diff it again, then count number of non-zeros. The only complication is the case where the first diff vector looks like:
[1 1 0 1 1]
Once the zero is removed, it looks constant. That can be dealt with, but would be messy.
参考
カテゴリ
Help Center および File Exchange で Get Started with MATLAB についてさらに検索
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!