Index exceeds the number of array elements in for loop

Dears, hope you are doing fantastic.
I have a script that I use to find wavelength and wavenumber by uploading text files and define the values for x an y.
It goes ok for one file, however; with mutliple files I have an "Index exceeds the number of array elements" error
A help will be grestly appreciated, thanks :)
The script goes this way:
[file_list, path_n] = uigetfile('.txt', 'Multiselect', 'on');
filesSorted = natsortfiles(file_list);
if iscell(filesSorted) == 0;
filesSorted = (filesSorted);
end
for i = 1:length(filesSorted);
filename = filesSorted{i};
data = load([path_n filename]);
% Define x and y from the uploaded files
x = data (:,1);
y = data (:,2);
% Calculate Wavelength and Wavenumber K from the uploaded files
[maxvaly,idx] = max(y);
maxvalx = x(idx);
[idx,idx]=findpeaks(y);
Wavelength(i)=x(idx(2))-x(idx(1))
Wavenumber(i)=(2*pi)/Wavelength(i)
end

 채택된 답변

Walter Roberson
Walter Roberson 2021년 6월 20일
Wavelength(i)=x(idx(2))-x(idx(1))
Your code is assuming that findpeaks() will always be able to find at least two peaks. You should not assume that. You should be checking length() of the result.

댓글 수: 5

Any idea how to edit it Walter?
Where can I introduce length() to the script?
TIA
[peakValues, idx] = findpeaks(y);
if length(idx) >= 2
Wavelength(i)=x(idx(2))-x(idx(1));
else
Wavelength(i) = nan;
warning('Not enough peaks for file: "%s', filenaname);
end
To begin with, thank you so much for the contribution.
I just have one thing to add.
If you have a look at the image below, I choose two files, the second one shows wavelength as NaN, but looking at the graph, the is a wave shape, thus two peaks, what could be the cause to that?
Note: the values of y for the case of NaN here are to the power of -11 or -12 so they are pretty close to 0 but since we are taking the index, I don't think that matters, right?
Thanks again Walter
Never mind, you were absolutely right, the shape of the wave was irregular and that is why I had a NaN output, it has to be fitted into a function first and then get the wavelength properly.
Thank you and god bless!
sorry, I do not know much about the Algorithm. You could experiment with findpeaks of (say) 1000 times the input signal.

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

Sulaymon Eshkabilov
Sulaymon Eshkabilov 2021년 6월 20일

0 개 추천

The problem is with this 3rd party fcn file: filesSorted = natsortfiles(file_list);
Note that the variable file_list contains th being imported file name, e.g.: 'ABC123.txt'
So, the err is occuring on: filesSorted = natsortfiles(file_list);
and then filename = filesSorted{i}; is not giving the following file name as you've anticipated.

댓글 수: 2

Thanks Sulaymon, What can be done here to solve it and keep the pattern of importing files intact?
Stephen23
Stephen23 2021년 6월 22일
편집: Stephen23 2021년 6월 22일
"What can be done here to solve it and keep the pattern of importing files intact?"
Nothing is required to "solve" it, because NATSORTFILES is certainly not the cause of that error.
Lets consider the possible configurations of UIGETFILE's first output:
  • user selects multiple files: NATSORTFILES sorts and and returns a cell array of char vectors,
  • user selects one file: NATSORTFILES returns the one char vector,
  • user selects zero files: NATSORTFILES throws an error due to the invalid input data class (but this error is moot, because your code cannot anyway handle this case: you can decide if you want to handle this case yourself and add the appropriate code).
However there is an obvious bug in your code, because you used parentheses instead of curly braces here:
filesSorted = (filesSorted);
% ^ ^ these do nothing at all
It should be:
if ~iscell(filesSorted)
filesSorted = {filesSorted};
end % ^ ^ you need curly braces!
or simply replace the entire IF-statement with this:
filesSorted = cellstr(filesSorted);
That bug will cause an error to be thrown later in your code (but is totally unrelated to your NATSORTFILES useage, or the error you gave in your question, or anything written in this incorrect answer).

댓글을 달려면 로그인하십시오.

Sulaymon Eshkabilov
Sulaymon Eshkabilov 2021년 6월 20일
Easy solution is to get all file names to be read (to be imported in *.txt). That can be done with:
Finfo = dir('*.txt');
Fnames = {Finfo.name};
for i = 1:length(Fnames);
filename = Fnames{i};
...
end

댓글 수: 1

I replaced what I have with what you suggested, unfortunately still the same error of:
Index exceeds the number of array elements (0).
Error in test (line 40)
Wavelength(i)=x(idx(2))-x(idx(1))

댓글을 달려면 로그인하십시오.

Image Analyst
Image Analyst 2021년 6월 20일
[idx,idx]=findpeaks(y);
is not right. It should be
[peakValues, indexesOfPeaks] = findpeaks(y);

댓글 수: 5

It gives the same error? should I change "Wavelength(i)=x(idx(2))-x(idx(1))" as well?
Of course, there is no badly-named, ambiguous idx variable anymore. I fixed that by separating them out into two nicely named variables.
What is Wavelength? Is it the delta X value?
Oh I see.
Wavelength basically is the coressponding x values for the highest two consecutive y values.
For instance, it is 20-10 in the example below, 20 and 10 are the corresponding values for the highest two consecutive y values, so how can it be expressed with your script?
Thanks for your help, much appreciated
The you can do
% Get the x values of all the peaks
xPeaks = x(indexesOfPeaks);
% Find distance between adjacent peaks.
peakSpacings = diff(xPeaks);
% Find the mean peak-to-peak spacing.
Wavelength = mean(peakSpacings)
Thank you for your valuable input, appreciate it, will try it for sure.

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Logical에 대해 자세히 알아보기

제품

릴리스

R2021a

질문:

2021년 6월 20일

편집:

2021년 6월 22일

Community Treasure Hunt

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

Start Hunting!

Translated by