calculate mean using while and iteration?

Hi,
I have data of ~3500x2. I want to calulate mean of second column for a particular condition in first column using 'while'.
let data (a, b) be like
0.5 1.8
0.6 1.5
0.9 1.8
1.0 1.5
1.1 1.4
1.2 1.4
1.5 1.6
1.8 1.2
2.1 1.2
2.3 1.3
2.4 1.5
2.6 1.8
2.9 2.0
3.0 3.0
3.12 3.2
3.15 1.9
3.16 1.7
3.18 2.2
I need to calculate mean of b, if a> 0.5 and a<1.5. Then increase 'a' by 1 and calculate mean of b (i.e for a > 1.5 and a<2.5) and so on. It may be a silly question but I am stuck with it. My code is
del=0.5;
k=1;
a(k)=1;
while(a(k) >(a(k)-del) && a(k)< (a(k)+del))
xn(k)=mean(b(k));
k= k+1;
a(k)=a(k)+1;
end
but it shows error Index exceeds array bounds.
Error in untitled (line 12)
a(k)=a(k)+1;
Thank you for your help.

2 comentarios

David Wilson
David Wilson el 30 de Abr. de 2019
Editada: David Wilson el 30 de Abr. de 2019
My code below is a bit ugly, but I think it does what you want:
cutoff = [0.5 1.5]; % band of interest
maxA = ceil(max(a))+0.5;
bmean = [];
for i=1:maxA
idx = find(a>cutoff(1) & a<cutoff(2));
bmean(i) = mean(b(idx));
cutoff = cutoff+1;
end
The means of column "b" are in variable bmean.
I note that you specified strict < as opposed to <= which may, or may not be what you really want.
Note that column a need not be sorted in increasing order.
Madan Kumar
Madan Kumar el 30 de Abr. de 2019
Thank you...

Iniciar sesión para comentar.

 Respuesta aceptada

Rik
Rik el 30 de Abr. de 2019
So you want to calculate these values?
xn(1)=mean(b(a>0.5 & a<1.5));
xn(2)=mean(b(a>1.5 & a<2.5));
xn(3)=mean(b(a>2.5 & a<3.5));
etc?
You don't need a while loop for that:
a=[0.5 0.6 0.9 1.0 1.1 1.2 1.5 1.8 2.1 2.3 2.4 2.6 2.9 3.0 3.12 3.15 3.16 3.18];
b=[1.8 1.5 1.8 1.5 1.4 1.4 1.6 1.2 1.2 1.3 1.5 1.8 2.0 3.0 3.2 1.9 1.7 2.2];
del=0.5;
xn=zeros(1,ceil(max(a-del)));
for k=1:size(xn,2)
xn(k)=mean(b(a>(k-del) & a<(k+del)));
end

4 comentarios

Madan Kumar
Madan Kumar el 30 de Abr. de 2019
Thank you...
Suppose, I need
xn(0.5)=mean(b(a>0.25 & a<0.75));
xn(1)=mean(b(a>0.75 & a<1.25));
xn(1.5)=mean(b(a>1.25 & a<1.75));
xn(2)=mean(b(a>1.75 & a<2.25)); etc.
How do I need to change the loop? because if I do like below, there is error
del=0.25;
xn=zeros(1,ceil(max(a-del)));
for k=1:0.5:size(xn,2)
xn(k)=mean(b(a>(k-del) & a<(k+del)));
end
array indices must be positive integers or logical values.
Stephen23
Stephen23 el 30 de Abr. de 2019
Editada: Stephen23 el 30 de Abr. de 2019
"Suppose, I need xn(0.5)=... "
You can't. Indices must be whole integers greater than zero.
Either change del to 0.25 and leave it at that, or write a function which lets you have any input values that you desire. But you certainly cannot have indexing with non-integer values.
Madan Kumar
Madan Kumar el 3 de Mayo de 2019
Ok...thank you...

Iniciar sesión para comentar.

Más respuestas (1)

KSSV
KSSV el 30 de Abr. de 2019
Why loop? YOu can use inbuilt in mean. Let a,b be your columns.
idx = a>0.5 & a<1.5 ;
mean(b(idx))

Categorías

Etiquetas

Preguntada:

el 30 de Abr. de 2019

Comentada:

el 3 de Mayo de 2019

Community Treasure Hunt

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

Start Hunting!

Translated by