Count the sequence of same values in an array until an new value comes up

7 Ansichten (letzte 30 Tage)
J.P.
J.P. am 17 Dez. 2016
Kommentiert: Image Analyst am 1 Dez. 2022
Hello everybody!
I need to count every sequence of same values, until a new, different sequence of a value comes up. Then, I need to count the new sequence.
As example: My row is 00000001111-1-1-1-1-1000111
I want to get a table saying:
Element: 0 1 -1 Count: 2 2 1
This means that I have 2 sequences of zeros, two sequences of ones and one sequence of minus ones.
I don't need to count each value, just the sequence until the next sequnece of values!
Thank you.
  1 Kommentar
dpb
dpb am 17 Dez. 2016
Bruno Luong has a runs-counting submittal at FileExchange that'll probably be just the ticket...

Melden Sie sich an, um zu kommentieren.

Antworten (3)

the cyclist
the cyclist am 17 Dez. 2016
Bearbeitet: the cyclist am 17 Dez. 2016
Get RunLength from the File Exchange.
Then,
x = RunLength([0 0 0 1 1 -1 -1 0 0 1 1 ]);
u = unique(x); % The unique values
c = histcounts(x,[u Inf]); The number of sequences of those unique values

Jan
Jan am 18 Dez. 2016
Bearbeitet: Jan am 18 Dez. 2016
Simpler than RunLength, because the sequence length does not matter:
x = [0 0 0 1 1 -1 -1 0 0 1 1 ];
B = x([diff(x)~=0, true]);
u = unique(B); % The unique values
c = histcounts(x, [u, Inf]);
The calculation of B is slower then with RunLength.mex, but if runtime is not the problem in your case, you can save the time and effort for compiling.
  3 Kommentare
Reji G
Reji G am 1 Dez. 2022
How to count number of zeros(or any other particular number) alone?
Image Analyst
Image Analyst am 1 Dez. 2022
@Reji G here are some ways
x = [0 0 0 1 1 -1 -1 0 0 1 1 ];
numZeros = nnz(x == 0)
numZeros = 5
numZeros = numel(x) - nnz(x)
numZeros = 5
numZeros = sum(x == 0, 'all')
numZeros = 5

Melden Sie sich an, um zu kommentieren.


Image Analyst
Image Analyst am 18 Dez. 2016
This is trivial (4 lines of code) with bwlabel of the Image Processing Toolbox which counts regions:
m = [0 0 0 0 0 0 0 1 1 1 1 -1 -1 -1 -1 -1 0 0 0 1 1 1] % Instantiate sample data.
uniquem = unique(m)
for k = 1 : length(uniquem)
[labeledData, counts(k)] = bwlabel(m == uniquem(k));
end
% Done! Now show to command window so we can see the results.
counts % Shows 1,2,2 for number of regions for -1, 0, 1
If you don't want the counts in numerical order like -1,0,1 then you can of course simply put "counts" in whatever order you want to sort it in.

Kategorien

Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by