Mean calculations in a for-loop

4 views (last 30 days)
xenon99942
xenon99942 on 17 Jan 2019
Edited: Andrei Bobrov on 23 Jan 2019
mean_240= zeros(2976,1); %preallocate vector
mean_240(1)=mean(T(1:216),'omitnan');
index = 2;
for i = 217:size(T,1)
mean_240(index) = mean(T((i-239):i),'omitnan');
index = index+1;
end
Hi all!
i have a 3192x1 vector and i want to calculate the 'backward' mean of every element of T ,considering the last 240 elements of each datapoint. i want to start at datapoint T(217) (the first 216 elements mean are calctulaeted seperately outside the lop), but as you can see, there are not enough values from 1:216 to calculate a 240element-mean and the above code won't work. so i want to modify the mean calculation until there are enough elements to proceed with the 240-mean-loop.
E.G. for the first for-loop step i = 217 the mean would be
mean_240(2) = mean(T((i-216):i),'omitnan');
and for the next step i = 218 we can use one more sample point to calculate the mean
mean_240(3) = mean(T((i-217):i),'omitnan');
.. and so on until we reach i = 240, then we above loop would work and we can calculate the whole 240point mean for the other sample points. how can i write that?

Answers (2)

xenon99942
xenon99942 on 17 Jan 2019
Edited: madhan ravi on 17 Jan 2019
Hello!
i think i have a first solution. Don't know if it's espensive or not:
mean_240= zeros(2976,1);
mean_240(1)=mean(T(1:216),'omitnan');
index = 2;
for i = 217:size(T,1)
if i<239
mean_240(index)=mean(T((i-(214+index)):i));
else
mean_240(index) = mean(T((i-238):(i+(index-2))),'omitnan');
%index = index+1;
end
index = index+1;
end
  2 Comments
xenon99942
xenon99942 on 17 Jan 2019
Edited: xenon99942 on 17 Jan 2019
sorry the index = index+1 should be outside the if statement. But no i am getting still a solution matrix with only zeros in it. can you see the error?

Sign in to comment.


Andrei Bobrov
Andrei Bobrov on 17 Jan 2019
Edited: Andrei Bobrov on 23 Jan 2019
EDIT
Let A is your vector with length n = 3192.
i1 = 217;
ii = 240;
B = A;
n = numel(A);
lo = isnan(A);
B(lo) = 0;
p = ones(n,1);
p(lo) = 0;
k = ones(ii,1);
Bp = conv2([B,p],k);
out = Bp(i1:n,1)./Bp(i1:n,2);
  3 Comments
Andrei Bobrov
Andrei Bobrov on 17 Jan 2019
Edited: Andrei Bobrov on 17 Jan 2019
Thank you Steven for your clarification.
xenon99942
xenon99942 on 21 Jan 2019
Edited: xenon99942 on 21 Jan 2019
no i don't want to discard the first 216 elements. I want to compute the "most-element"-mean, which is possible. thats why i want to increase the number of elements in each step till i reach datapoint index 240 from which i start to compute the backward 240-element-mean of every following element. I am using an old matlab version, so "movmean" is not available.
T is an 3192x1 vector of data type "double"
The above code doens't run anymore. Error message:
??? Error using ==> sum
Trailing string input must be 'double' or 'native'.
Error in ==> mean at 30
y = sum(x,dim)/size(x,dim);
Befor that error message ( the code is the same), i just got zeros as output. Can you see the error?

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!