How do I find the duration of a number in an array?

2 views (last 30 days)
Given the array
c=[3 3 3 5 5 6 7 8 1 1 3 3 3 0 0 0 4 4 4 5 6 7 8 3 3 3 9 10 3];
I am trying to find the average duration of each number in this array. For example, I am looking to find the average duration for 3 in this array. I know that 3 occurs 10 times but is grouped into 4 separate occurrences. I want the output to be the average duration for 3...which is 2.5. please help!

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 28 May 2015
Edited: Andrei Bobrov on 28 May 2015
c = c(:);
ii = [true;diff(c)~=0];
i2 = diff([find(ii);numel(ii)+1]);
[a,b,c0] = unique(c(ii),'first'); % in new version of MATLAB:
[~,jj] = sort(b); %
[~,j1] = sort(jj); % [a1,~,c1] = unique(c(ii),'stable');
a1 = a(jj); %
c1 = j1(c0); %
out = [a1,accumarray(c1,i2,[],@mean)];
or with sorting
ii = [true;diff(c)~=0];
i2 = diff([find(ii);numel(ii)+1]);
[a,~,c0] = unique(c(ii));
out1 = [a,accumarray(c0,i2,[],@mean)]
  2 Comments
Joe
Joe on 28 May 2015
I am applying this to my data set and the inputs range from 1-10. However, if there are no occurrences of an input (example= there is no 2 in the data set above how can I make sure the output array will have a zero in the place of the 2 or any other number in the series? Is there a way to output a c(2,10) array with c(1,10) being equal to 1:10 and the c(2,10) array being filled with the output values for average duration. if there are none I would want an empty place value to be filled with a zero.

Sign in to comment.

More Answers (1)

Azzi Abdelmalek
Azzi Abdelmalek on 28 May 2015
c=[3 3 3 5 5 6 7 8 1 1 3 3 3 0 0 0 4 4 4 5 6 7 8 3 3 3 9 10 3];
[ii,jj,kk]=unique(c)
d=accumarray(kk,1)
for k=1:numel(ii)
a=ii(k)
res(k)=d(k)/numel(strfind([0 c==a 0],[0,1]))'
end
out=[ii' res']

Categories

Find more on Data Type Conversion in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!