Read in files with loop

조회 수: 25 (최근 30일)
Benjamin Cowen
Benjamin Cowen 2018년 8월 10일
댓글: Image Analyst 2018년 8월 10일
I have the code below which reads in the data to log200. The thing is, I also need to read in other data too.
I need log200, log225, log250, in increments of 25 up to log900
How can I take my current working script which reads in log200, and replace it with a loop so that I do not have to copy and paste dozens of times?
clear
clc
lastn=1;
log200=importdata('C:/Users/Ben/Desktop/log.200_equil', ' ', 20, 0);
log200_cell = log200.data(:,6);
log200_cell = log200_cell(1:end-lastn,:);
log200_density_average=mean(log200_cell)
  댓글 수: 8
Stephen23
Stephen23 2018년 8월 10일
편집: Stephen23 2018년 8월 10일
@Benjamin Cowen: sure. It would help a lot if you uploaded a sample file or two, by clicking the paperclip button.
Benjamin Cowen
Benjamin Cowen 2018년 8월 10일
편집: Benjamin Cowen 2018년 8월 10일
There is a sample file in my original question. By the way, I tried your solution below, and it seems like you know what you are talking about. I appreciate the help. I have a data structure (I guess), labeled C. This is {1,29}. Each one of these has a matrix in it called data. First I want to delete the last line from each matrix, which my original code did, and then take the average of the last 100 points in the 6th column. I tried doing some of this with my original solution. How do I apply it here?

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

채택된 답변

Stephen23
Stephen23 2018년 8월 10일
편집: Stephen23 2018년 8월 10일
Simpler to use indexing and fullfile:
D = 'C:/Users/Ben/Desktop/';
S = dir(fullfile(D,'*_equil')); % where is the file extension?
N = numel(S);
C = cell(1,N);
M = nan(1,N);
for k = 1:N
F = fullfile(D,S(k).name);
fprintf('Now reading %s\n',F);
T = importdata(F,' ',20);
C{k} = T.data;
M(k) = mean(T.data(1:end-1,6));
end
All data will be in cell array C, and M should be all of the mean data joined together into one numeric vector. You will need to check the options for importdata: I don't have this so I can't run this code!
"... then take the average of the last 100 points in the 6th column"
If you really want the last 100 points, then perhaps you will need this:
D{k} = mean(T.data(end-100:end-1,6));
  댓글 수: 7
Benjamin Cowen
Benjamin Cowen 2018년 8월 10일
I think you have helped enough. I got a good enough start on this problem. thanks for all the help!
Stephen23
Stephen23 2018년 8월 10일
@Benjamin Cowen: any time, it was a pleasure! It is nice working with people who show an interest, and who actually respond to our replies :)
Good luck with the code and come and ask us anything!

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

추가 답변 (2개)

Paul Shoemaker
Paul Shoemaker 2018년 8월 10일
편집: Paul Shoemaker 2018년 8월 10일
You could wrap it in a FOR loop and employ the "eval" function.
lastn=1;
clear
clc
for idx = 200:25:900
temp = importdata(['C:/Users/Ben/Desktop/log.' num2str(idx) '_equil'], ' ', 20, 0); % Use num2str to replace "200" with the idx value
temp = temp.data(:,6);
temp = temp(1:end-lastn,:);
eval(['log' num2str(idx) '_density_average=mean(temp);']); % Now evaluate to create desired output
end
In the above, I'm assuming that only the "mean" calculation is desired and everything prior to that is just processing that you can throw away. If not, you can use "eval" on those as well.

Image Analyst
Image Analyst 2018년 8월 10일
Do not use eval(). To read in a bunch of files called "log.***" use one of the two code samples in the FAQ: https://matlab.wikia.com/wiki/FAQ#How_can_I_process_a_sequence_of_files.3F
  댓글 수: 2
Benjamin Cowen
Benjamin Cowen 2018년 8월 10일
편집: Benjamin Cowen 2018년 8월 10일
How do I use this code, below, which reads in each file, and perform the above operations still?
lastn=1;
clear
clc
% Specify the folder where the files live.
myFolder = 'C:/Users/Ben/Desktop/';
% Check to make sure that folder actually exists. Warn user if it doesn't.
if ~isdir(myFolder)
errorMessage = sprintf('Error: The following folder does not exist:\n%s', myFolder);
uiwait(warndlg(errorMessage));
return;
end
% Get a list of all files in the folder with the desired file name pattern.
filePattern = fullfile(myFolder, '*_equil'); % Change to whatever pattern you need.
theFiles = dir(filePattern);
for k = 1 : length(theFiles)
baseFileName = theFiles(k).name;
fullFileName = fullfile(myFolder, baseFileName);
fprintf(1, 'Now reading %s\n', fullFileName);
end
Image Analyst
Image Analyst 2018년 8월 10일
It doesn't look like your file pattern is correct, but it looks like you have a working answer from Stephen. However, if you're still interested in using the FAQ code...
I think the file pattern should have been 'log.*' will work for "log.300_equil" if the extension if of the form "nnn_equil".
And 'log*.txt' will work for "log.300_equil.txt" if your files have '.txt' extensions like the one you attached.

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

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by