calculate mean using while and iteration?
    4 views (last 30 days)
  
       Show older comments
    
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 Comments
  David Wilson
      
 on 30 Apr 2019
				
      Edited: David Wilson
      
 on 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. 
Accepted Answer
  Rik
      
      
 on 30 Apr 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 Comments
  Stephen23
      
      
 on 30 Apr 2019
				
      Edited: Stephen23
      
      
 on 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.
More Answers (1)
  KSSV
      
      
 on 30 Apr 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))
See Also
Categories
				Find more on Matrix Indexing in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



