index out of bounds because numel(averg)=1

Asked by Benjamin on 8 Aug 2012
Latest activity Commented on by Sean de Wolski on 8 Aug 2012

This is the code that I'm currently using:

 A = interpolate;    
 averg = mean([A(1:end-2),A(3:end)],2);
 streaking = [];
 for idx = 2:size(A,2)-1
    streaking(:,idx) = (abs(A(:,idx)-averg(idx))./averg(idx))*100;
 end 

The full error message:

>> Attempted to access averg(2); index out of bounds because numel(averg)=1.

>> Error in rad_cal2 (line 817)

    streaking(:,idx) = (abs(A(:,idx)-averg(idx))./averg(idx))*100;

interpolate is a matrix

0 Comments

Benjamin

Products

No products are associated with this question.

1 Answer

Answer by Laura Proctor on 8 Aug 2012
Edited by Laura Proctor on 8 Aug 2012
Accepted answer

You are using linear indexing to index into A, and so the output is a row vector. For example: A(1:end-2) will take all terms except for the last two in the matrix A, and create a row vector. Concatenating A(1:end-2) with A(3:end) creates a really long row vector. The mean of a row vector along the row, takes the average of all the elements which produces a scalar value for averg.

If you want to take the ROWS 1:end-2, then you can index into A using row column indexing:

A(1:end-2,:)

For what values are you trying to find the means? How are you trying to arrange the values in A to find the means? Be careful how you find that matrix ([A(1:end-2),A(3:end)]) - you may want to add an intermediate variable to calculate it, and then find the mean.

A = interpolate;
B = (A(1:end-2,:) + A(3:end,:))/2;
averg =   mean(B,2)

modified accordingly.

7 Comments

Sean de Wolski on 8 Aug 2012
averg2 = conv2(A,ones(3,1)./3,'valid');
Benjamin on 8 Aug 2012

Is there any benefit to using your input Sean opposed to Laura's method? If there is how would you adapt it to this:

 averg = (A(1:end-2,:) + A(3:end,:))/2;
Sean de Wolski on 8 Aug 2012

No, just a different approach. More adaptable if say you wanted to use a longer window length. E.g. to change mine to include 5 elements one each side:

averg2 = conv2(A,ones(11,1)./11,'valid');

To adapt it to your above:

averg2 = conv2(A,[0.5;0;0.5],'valid')
Laura Proctor

Contact us