how to create a for loop 380:780?

Hi,
how can I create a for loop between in this statement
CM4_380 = spec_data(spec_data.wavelength>380 & spec_data.wavelength<381,:);
so it for loops between 380:780? Basically, to make this:
CM4_381 = spec_data(spec_data.wavelength>381 & spec_data.wavelength<382,:);
CM4_382 = spec_data(spec_data.wavelength>382 & spec_data.wavelength<383,:);
CM4_383 = spec_data(spec_data.wavelength>383 & spec_data.wavelength<384,:);
etc. Plus I need to save each of those tables.
Thank you for your help!

 Accepted Answer

I would use a cell array, not variable names that also encode an index:
for ic = 380:780
CM4{ic} = spec_data(spec_data.wavelength>ic & spec_data.wavelength<(ic+1),:);
end

10 Comments

vicsm
vicsm on 13 Sep 2019
Edited: vicsm on 13 Sep 2019
not working
Well, given the tiny amount of information you gave in your question, I would say that it certainly does work.
spec_data = struct('wavelength',381.5);
for ic = 380:780
CM4{ic} = spec_data(spec_data.wavelength>ic & spec_data.wavelength<(ic+1),:);
end
That code results in exactly what I would expect.
So, instead of just saying "not working", it would be better if you gave more context, uploaded your full code (or at least a portion that we can run), and the full text of any error message you are getting.
vicsm
vicsm on 13 Sep 2019
Edited: vicsm on 13 Sep 2019
Sorry. Here is my entire code:
load raw_CM4_19.mat
numfiles = length(txtFiles);
spec_data = [];
for k = 1:numfiles
spec = table(txtFiles(k).wavelength,txtFiles(k).irradiance,'VariableNames',{'wavelength','irradiance'});
spec = spec(spec.wavelength>380 & spec.wavelength<781,:);
spec_data = vertcat(spec_data,spec);
end
for ic = 380:780
CM4{ic} = spec_data(spec_data.wavelength>ic & spec_data.wavelength<(ic+1),:);
end
I see that my code does indeed give an error here. But for the MAT file you uploaded, spec_data is empty, because numfiles is 0, because txtFiles is empty.
So, it's not a good test case, it seems.
Well, that's weird because for me it's working just fine...spec_data is 54672x2, because numfiles is 48, because txtFiles is a 48x1 structure.
Are you sure you uploaded the file you intended to? In your code, it is called raw_CM_19.mat, but the file you uploaded is raw_CM4_19.mat.
Thank you for noticing. Indeed, I uploaded the wrong one. Comment edited!
So, is there still a problem? Your code runs to completion for me, and fills in the cells I would expect.
I would suggest
for ic = 380:780
CM4{ic-380+1} = spec_data(spec_data.wavelength>ic & spec_data.wavelength<(ic+1),:);
end
unless you have a use for CM4{1} to CM4{379}
I does work, thank you!

Sign in to comment.

More Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Tags

Asked:

on 13 Sep 2019

Commented:

on 13 Sep 2019

Community Treasure Hunt

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

Start Hunting!