Error in the loop

7 vues (au cours des 30 derniers jours)
santosh
santosh le 6 Avr 2011
Hi all, I am trying to plot the y co-ordinates for different files with respect to one x value but when i execute the program it is showing the following error:
Attempted to access x(133); index out of bounds because numel(x)=132.Error in ==> new2 at 48 if x(j) == Z1
It is pointing the following lines of code:
for i=1:4 prompt1 = {'enter next input file name including extension'}; fname1 = inputdlg(prompt1); a = importdata(char(fname1), DELIMITER, HEADERLINES); new2()
for j = 1:200
if x(j) == Z1
Z2 = y(j)
break;
end
end
figure(1);
plot(Z1,Z2,'r*');
hold on;
end
Can anyone pls help me out,
regards
  2 commentaires
bym
bym le 6 Avr 2011
please post the code that defines y,Z1 and x before the loop.
essentially x(133) (and higher) don't exist
santosh
santosh le 6 Avr 2011
function [Z1,Z2,Z3,Z4]= new2(x,y)
% read .cor file
DELIMITER = '\t';
HEADERLINES = 74;
prompt1 = {'enter the input file name including extension'};
fname1 = inputdlg(prompt1);
% Import the file change the fileName
a = importdata(char(fname1), DELIMITER, HEADERLINES);
function [] = new2(~,~)
x = a.data(:,1);
y = a.data(:,2);
% clf;
figure(2);
plot(x,y);
hold on;
%%%%%%% joining the end points
figure(1);
plot(x([1 end]),y([1 end]));
end
new2()
Z1= median(x)
for i = 1:100
if x(i) == Z1
Z2 = y(i)
break;
end
end
figure(1);
plot(Z1,Z2,'r*');
hold on;
%%%%%%%%%% loop to take different files
for i=1:4
prompt1 = {'enter next input file name including extension'};
fname1 = inputdlg(prompt1);
a = importdata(char(fname1), DELIMITER, HEADERLINES);
new2()
for j = 1:200
if x(j) == Z1
Z2 = y(j)
break;
end
end
figure(1);
plot(Z1,Z2,'r*');
hold on;
end
end
this is the complete code and input files contains x whose index ends at 132

Connectez-vous pour commenter.

Réponses (3)

Matt Tearle
Matt Tearle le 6 Avr 2011
Well, the obvious answer is basically what the error message is saying: x only has 132 elements, but you're looping j up to 200. So when j gets to 133, the line if x(j) ... is going to fail.
What may be causing the problem is the ==. If x and Z1 are doubles, you may not get exact equality. If you were planning on that, that could be causing your indexing error. Try
if abs(x(j)-Z1) < tol
where tol is some small value.
Trying to interpret your code, it seems like you're trying to define Z2 to be the value of y at whichever index x is equal to Z1. If so, why not use logical indexing instead:
Z2 = y(x==Z1);
or, as discussed above,
Z2 = y(abs(x-Z1)<tol);
(This line replaces the whole for-loop, BTW)
  2 commentaires
santosh
santosh le 6 Avr 2011
Hi Matt, thanks alot for ur answer but still i m getting the same error if i use the line Z2 = y(x(i)==Z1);
inside the for loop
Matt Tearle
Matt Tearle le 6 Avr 2011
Again, this shouldn't be in a loop.
But, regardless, now you've posted the full code I can see the problem. I'll add another answer.

Connectez-vous pour commenter.


Walter Roberson
Walter Roberson le 6 Avr 2011
Your function is named new2, and inside that function you define a subfunction that is also named new2. At least one of us is confused.
  2 commentaires
santosh
santosh le 6 Avr 2011
I changed it but stil i m getting the same error
Jan
Jan le 6 Avr 2011
Please update the posted code by editing your original question - and please use code formatting to improve the readability.

Connectez-vous pour commenter.


Matt Tearle
Matt Tearle le 6 Avr 2011
The problem is that Z1 is the median of x, and x has an even number of elements. In that case, the median is the average of the two middle values. If they're not the same, the median will not be any of the values in x. The real question is what y you want back in that case. The average of the two x values in the middle?
Z1 = median(x);
tmp = abs(x-Z1);
Z2 = mean(y(tmp == min(tmp)));
This will work for any number of elements of x.
  1 commentaire
Matt Tearle
Matt Tearle le 6 Avr 2011
Just to clarify, these three lines replace
Z1= median(x)
for i = 1:100
if x(i) == Z1
Z2 = y(i)
break;
end
end

Connectez-vous pour commenter.

Catégories

En savoir plus sur Graphics Performance dans Help Center et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by