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 Kommentare

David Wilson
David Wilson am 30 Apr. 2019
Bearbeitet: David Wilson am 30 Apr. 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 am 30 Apr. 2019
Thank you...

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Rik
Rik am 30 Apr. 2019

0 Stimmen

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 Kommentare

Madan Kumar
Madan Kumar am 30 Apr. 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 am 30 Apr. 2019
Bearbeitet: Stephen23 am 30 Apr. 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 am 3 Mai 2019
Ok...thank you...

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

KSSV
KSSV am 30 Apr. 2019

0 Stimmen

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

Kategorien

Community Treasure Hunt

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

Start Hunting!

Translated by