Making slight changes to code- adding loop/returning values

1 view (last 30 days)
I am given this code table.
1 4 2001 30 29 8 1
2 4 2001 4 5 2 1
2 4 2001 9 6 4 7
2 4 2002 19 14 7 3
2 4 2003 25 21 5 4
2 4 2004 7 18 4 5
2 4 2005 8 3 4 10
2 4 2005 10 27 8 0
2 4 2005 12 22 5 6
and I created this code that gives the average of the 6th and 7th column.
% Yearstart=mean(sum(tab(tab(:,3)==firstyear,6:7), 2));
% Yearstart=mean(sum(tab(tab(:,3)==firstyear+1,6:7), 2));
Year2001=mean(sum(tab(tab(:,3)==2001,6:7), 2));
Year2002=mean(sum(tab(tab(:,3)==2002,6:7), 2));
Year2003=mean(sum(tab(tab(:,3)==2003,6:7), 2));
Year2004=mean(sum(tab(tab(:,3)==2004,6:7), 2));
Year2005=mean(sum(tab(tab(:,3)==2005,6:7), 2));
%Yearend=mean(sum(tab(tab(:,3)==endyear-1,6:7), 2));
%Yearend=mean(sum(tab(tab(:,3)==endyear,6:7), 2));
AverageForAllYears= [Yearstart,Year2001,Year2002,Year2003,Year2004,Year2005, Yearend];
HighestAverageYear= max(AverageForAllYears); %this gives the highest average year
I would like help on 2 things, when I am given a different table with different Years I would like to have my code work for those years say earliest year was 1995 and the latest was 2010 my code would not work. I would like a code that finds the average for each year from the earliest value in the table to the latest (I tried include an example of what I'm kind of looking for in the code commented). And finally if possible, how would I return that year in an answer. For example say max(AverageForAllYears) produces a value of 9.5, and lets say 9.5 occured in the year 2002. How would I produce a final answer of 2002. Thanks for the help.

Accepted Answer

Star Strider
Star Strider on 21 Oct 2015
This code does its best to be robust to the years:
tab = [1 4 2001 30 29 8 1
2 4 2001 4 5 2 1
2 4 2001 9 6 4 7
2 4 2002 19 14 7 3
2 4 2003 25 21 5 4
2 4 2004 7 18 4 5
2 4 2005 8 3 4 10
2 4 2005 10 27 8 0
2 4 2005 12 22 5 6];
tab3 = tab(:,3)-min(tab(:,3))+1; % Create Normalised Date Range Vector
mean6 = accumarray([tab3], [tab(:,6)], [], @mean); % Mean Column 6
mean7 = accumarray([tab3], [tab(:,7)], [], @mean); % Mean Column 7
Output = [[min(tab(:,3)):max(tab(:,3))]' mean6 mean7]; % Result
  1 Comment
Star Strider
Star Strider on 21 Oct 2015
I don’t understand ‘missed a minus between mean6 and mean7’. I didn’t see any minuses, and I didn’t see that you wanted the difference between the columns.
‘Is there anyway I can return the output to the corresponding year?’
The ‘Output’ array has the years in the first column and the corresponding means for Columns 6 and 7 in the second and third columns, respectively. When I looked at them and did some sample calculations to verify my code, they were correct.
I didn’t calculate ‘AverageForAllYears’ (it seems the first and last rows are duplicated) and ‘HighestAverageYear’ because I didn’t understand how you created and calculated them. The max function will take the maximum over the columns (its default behaviour), and with two arguments, will return the index of the first occurrence of the maximum in the column. If you do this:
[outmax,idx] = max(Output(:,2:3));
the ‘idx’ output will return [2 5] because different maxima for the columns occur in different years. The years would be:
HighestAverageYear = Output(idx,1)
those being [2002; 2005] with these data.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!