How can I loop through dates and store weight values in a matrix? [MATLAB] - matlab

Hi so I am new to MATLAB. I am trying to find the means of weight values for each month over five years and put these values into a matrix that will be 5x12 in size.
I am attempting to accomplish this with a loop but I'm having a little trouble, if anyone can push me towards the right direction that would be awesome, thanks. What I have so far is this:
weight_data = (10 weights per month for 10 years, 1200 weights total)
year = (years 2000-2010) %year 1-10 corresponds with the 1200 weights)
month = (months 1-12) %weights for all months (120 months, correspond with 1200 weights)
weight_vec = zeros([12, 5]);
for n = year(1:5)
weights = weight_data(n);
mean_weights = mean(weights);
end
This only gives me one number though, I assume the mean from the 5 years I'm trying to loop through. I also know I need to incorporate the months somehow but I'm just confused on how to do this.

Being your weight_data matrix (10 weights x 12 months x 10 years), the weight of the i-th year are located in weight_data(:,:,i).
w=weight_data(:,:,i)
w is a (10 x 12) which contains the 10 weights values of the 12 months.
You can use mean to compute the mean value of the weights of each month:
w=mean(weight_data(:,:,i))
Therefore you can setup a loop over the years:
for i=1:1:5
mean_weights(:,i)=mean(weight_data(:,:,i))'
end
(the ' in mean(weight_data(:,:,i))' is required to transpose the output of mean from a row-array to a column-array so that it fits in your output matrix which is (12 x 5)
Hope this helps,
Qapla'

Related

How to create a matrix using a for loop MATLAB

I have three vectors of the same size, pressure, year and month. Basically I would like to create a matrix of pressure values that correspond with the months and years that they were measured using a for loop. It should be 12x100 in order to appear as 12 months going down and 100 years going left to right.
I am just unsure of how to actually create the matrix, besides creating the initial structure. So far I can only find pressure for a single month (below I did January) for all years.
A = zeros([12, 100]);
for some_years = 1900:2000
press = pressure(year == some_years & month == 1)
end
And I can only print the pressures for January for all years, but I would like to store all pressures for all months of the years in a matrix. If anyone can help it would be greatly appreciated. Thank You.
Starting with variables pressure, year, and month. I would do something like:
A fairly robust solution using for loops:
T = length(pressure); % get number of time periods. I will assume vectors same length
if(length(pressure) ~= T || length(month) ~= T)
error('length mismatch');
end
min_year = min(year); % this year will correspond to index 1
max_year = max(year);
A = NaN(max_year - min_year + 1, 12); % I like to initialize to NaN (not a number)
% this way missing values are NaN
for i=1:T
year_index = year(i) - min_year + 1;
month_index = month(i); % Im assuming months run from 1 to 12
A(year_index, month_index) = pressure(i);
end
If you're data is SUPER nicely formatted....
If your data has NO missing, duplicate, or out of order year month pairs (i.e. data is formatted like):
year month pressure
1900 1 ...
1900 2 ...
... ... ...
1900 12 ...
1901 1 ...
... ... ...
Then you could do the ONE liner:
A = reshape(pressure, 12, max(year) - min(year) + 1)';

Row extraction from matrix in comparison to a smaller sized array.

I have a array "HolidayArrayDate" of 10 x 1 in decimal days.
734870
734884
so on
I have a matrix "weekdayRows" of 260 x 5 in decimal days
734870 734870.2 734870.4 734870.6 734870.8
734871 734871.2 734871.4 734871.6 734871.8
so on.
I have a matrix of "weekendRows" of 104 x 5 in decimal days
734870 734870.2 734870.4 734870.6 734870.8
734871 734871.2 734871.4 734871.6 734871.8
so on
How do i remove the 10 days in holidayArrayDate from weekdayRows and add them to weekendRows?
if i understand you correctly
index=ismember(weekdayRows(:,1),HolidayArrayDate);
Temp=weekdayRows(index,:);
% to remove them from weekdayRows
weekdayRows(index,:)=[];
% to add to weekendRows
weekendRows=[weekendRows; Temp];
% you might need to sort if the ordering is important
weekendRows=sort(weekendRows,1);

leap year mean in matlab

good morning. I have a matrix (eout) with 14610 rows and 16 column.
14610 row represent one of each day of the period between 01-01-1960 and 31-12-2000.
What I need is a new matrix with 40 rows and 16 columns with a mean for each year.
something like a mean of 365 rows continuously.
The problem I have are the leap years each 4 years.
Suggestions to solve this?
For a start, to get the number of days for a given year:
function n = ndays(year)
tmp = repmat([1,1,0,0,0],numel(year),1);
n = datenum([year(:)+1,tmp])-datenum([year(:), tmp]);
end
With this, you could collect the rows e.g. with mat2cell:
rows_per_year = ndays(1960:2000);
chunks = mat2cell(yourInputMatrix, rows_per_year, size(yourInputMatrix,2));
means = cellfun(#(x) mean(x,1), chunks);
(The latter part comes untested..)

Prediction of data using regression for time series

I try to prepare the data for regression with time series analysis. I use LIBSVM on Matlab
Say I have N days of price and I want to predict the next day's price. The training set X is thus a vector of vectors of length K, and the training set Y are like:
(DAY 1).....(DAY 2).....(DAY K)-------->DAY (K+1)
(DAY 2).....(DAY 3).....(DAY K+1)------>DAY (K+2)
(DAY 3).....(DAY 4).....(DAY K+2)------>DAY (K+3)
so on...
But the problem is: I assume the test data solution will give me the days of DAY (K+1),DAY (K+2),DAY (K+3). But it always fits the last day of Independent variables. (Here they are (DAY K), (DAY K+1), (DAY K+2)).
I tried to change the value of K but it didn't change.
To explain more: As an example, suppose we have the following univariate time series s :
1 2 3 4 5 6 7 8 9 =s[1]..s[9]
Windowizing using N=3 yields:
[s[k−3], s[k−2], s[k−1]] →s[k]
⎢1 2 3 ⎢ ⎢4⎢
⎢2 3 4 ⎢ ⎢5⎢
⎢3 4 5 ⎢ ⎢6⎢
⎢. . . ⎢ ⎢.⎢
⎢6 7 8 ⎢ ⎢9⎢
But the problem is the result fits the vector
⎢3⎥
⎢4⎥
⎢5⎥
...
⎢8⎥
I couldn't find where the problem is?

Daily values to Monthly Means for Multiple Years Matlab

I have observed daily data that I need to compare to generated Monthly data so I need to get a mean of each month over the thirty year period.
My observed data set is currently in 365x31 with rows being each day (no leap years!) and the extra column being the month number (1-12).
the problem I am having is that I can only seem to get a script to get the mean of all years. ie. I cannot figure how to get the script to do it for each column separately. Example of the data is below:
1 12 14
1 -15 10
2 13 3
2 2 37
...all the way to 12 for 365 rows
SO: to recap, I need to get the mean of [12; -15; 13; 2] then [14; 10; 3; 37] and so on.
I have been trying to use the unique() function to loop through which works for getting the number rows to average but incorrect means. Now I need it to do each month(28-31 rows) and column individually. Result should be a 12x30 matrix. I feel like I am missing something SIMPLE. Code:
u = unique(m); %get unique values of m (months) ie) 1-12
for i=1:length(u)
month(i) = mean(obatm(u(i), (2:31)); % the average for each month of each year
end
Appreciate any ideas! Thanks!
You can simply filter the rows for each month and then apply mean, like so:
month = zeros(12, size(obatm, 2));
for k = 1:12
month(k, :) = mean(obatm(obatm(:, 1) == k, :));
end
EDIT:
If you want something fancy, you can also do this:
cols = size(obatm, 2) - 1;
subs = bsxfun(#plus, obatm(:, 1), (0:12:12 * (cols - 1)));
vals = obatm(:, 2:end);
month = reshape(accumarray(subs(:), vals(:), [12 * cols, 1], #mean), 12, cols)
Look, Ma, no loops!