How to plot data for hundreds of rows in MATLAB?

조회 수: 3 (최근 30일)
JD_PM
JD_PM 2022년 4월 21일
댓글: Mathieu NOE 2022년 4월 25일
I am studying a flow going through an orifice.
I am aimed at overlapping the plots for the speed distribution over the vertical width profile (which is 0.015 m long; highlighted in red) for two downstream, horizontal distances [w.r.t. the orifice]: 0.01 m and 0.03 m.
The result should look as follows (the highest peak corresponds to 0.01m width profile)
I have the data for both downstream distances (in csv format, here you can find it https://drive.google.com/drive/folders/1CgeDuCahVZvLXXkNkGWlPg8lSGyurmI3).
Let me create two tables, first related to 0.01m data and second to 0.03 m. For the sake of simplicity I only include three row data. The columns labeled - contain irrelevant data for this particular problem.
Let's draw our attention to how to code this in MATLAB. The algorithm I have in mind is:
0) Optimize the given table: eliminate first and last rows (the velocity there is zero due to no-slip condition on the walls)
1) Read the velocity data from the csv table and compute the speed ##U = \sqrt{U_0^2 + U_1^2 + U_2^2}## for each data row.
2) Store the speed and width values in variables.
3) Repeat 2) and 3) for the other csv file.
4) Ready to plot.
I managed to write a code that works for the three-rows-of-data tables above
Ai = readtable("sampleData10mm.csv"); %step 0)
Bi = readtable("sampleData30mm.csv"); %step 0)
A = Ai(2:1000,:); %step 0)
B = Bi(2:1000,:); %step 0)
fComr1 = A{1:1,"U_0"}; %step 1)
sComr1 = A{1:1,"U_1"}; %step 1)
tComr1 = A{1:1,"U_2"}; %step 1)
fComr2 = A{2:2,"U_0"}; %step 1)
sComr2 = A{2:2,"U_1"}; %step 1)
tComr2 = A{2:2,"U_2"}; %step 1)
fComr3 = A{3:3,"U_0"}; %step 1)
sComr3 = A{3:3,"U_1"}; %step 1)
tComr3 = A{3:3,"U_2"}; %step 1)
Ur1 = sqrt(fComr1^2 + sComr1^2 + tComr1^2); %step 1)
Ur2 = sqrt(fComr2^2 + sComr2^2 + tComr2^2); %step 1)
Ur3 = sqrt(fComr3^2 + sComr3^2 + tComr3^2); %step 1)
speed = [0;Ur1;Ur2;Ur3]; %step 2)
width = [0;A{1:1,"Points_2"}+0.0075;A{2:2,"Points_2"}+0.0075;A{3:3,"Points_2"}+0.0075]; %step 2); Note I added +0.0075 because we want to have data from 0 to 0.016 mm in the x axis
fComr1_30mm = B{1:1,"U_0"}; %step 3)
sComr1_30mm = B{1:1,"U_1"}; %step 3)
tComr1_30mm = B{1:1,"U_2"}; %step 3)
fComr2_30mm = B{2:2,"U_0"}; %step 3)
sComr2_30mm = B{2:2,"U_1"}; %step 3)
tComr2_30mm = B{2:2,"U_2"}; %step 3)
fComr3_30mm = B{3:3,"U_0"}; %step 3)
sComr3_30mm = B{3:3,"U_1"}; %step 3)
tComr3_30mm = B{3:3,"U_2"}; %step 3)
Ur1_30mm = sqrt(fComr1_30mm^2 + sComr1_30mm^2 + tComr1_30mm^2); %step 3)
Ur2_30mm = sqrt(fComr2_30mm^2 + sComr2_30mm^2 + tComr2_30mm^2); %step 3)
Ur3_30mm = sqrt(fComr3_30mm^2 + sComr3_30mm^2 + tComr3_30mm^2); %step 3)
speed_30mm = [0;Ur1_30mm;Ur2_30mm;Ur3_30mm]; %step 3)
width_30mm = [0;B{1:1,"Points_2"}+0.0075;B{2:2,"Points_2"}+0.0075;B{3:3,"Points_2"}+0.0075]; %step 3)
figure %step 4)
plot(width,width_30mm,speed,speed_30mm) %step 4)
legend({'0.01 m', '0.03 m'},'Location','northwest') %step 4)
xlabel('width [m]') %step 4)
ylabel('U magnitude [m/s]') %step 4)
axis square; %step 4)
grid on; %step 4)
The issue I have is that I do not see how to write a code that does it for the 1000 rows. I guess there has to be a way of automatizing the whole process...
Thank you in advance! :)

채택된 답변

Mathieu NOE
Mathieu NOE 2022년 4월 21일
hello
mamma mia ! You are not using matlab capabilities to do math on arrays ... there is much simpler ways to do all this stuff.
demo below
  • first the hard work is done in a function so I can reuse it multiple times for different csv files
  • second, a for loop is used to repeat the same process automatically by screening your directory, finding the right csv files and sorting them in ascending order (what matlab does not do well => need to download the FEX submission files :
hope it helps
%% read multiple files
P = pwd; % currrent directory
S = dir(fullfile(P,'sampleData*.csv')); % get list of files in directory
fileNames_sorted = natsortfiles({S.name}); % sort file names into order (https://fr.mathworks.com/matlabcentral/fileexchange/47434-natural-order-filename-sort)
nFiles = numel(fileNames_sorted);
figure %step 4)
hold on
for k = 1:nFiles
filename = fullfile(P, fileNames_sorted{k});
[width,speed] = do_thejob(filename);
plot(width,speed)
end
hold off
%%% functions %%%
function [width,speed] = do_thejob(filename)
Ai = readmatrix(filename); %step 0)
[m,n] = size(Ai);
A = Ai(2:m-1,:); %step 0)
fComr = A(:,1); %step 1)
sComr = A(:,2); %step 1)
tComr = A(:,3); %step 1)
Ur = sqrt(fComr.^2 + sComr.^2 + tComr.^2); %step 1)
speed = [0;Ur]; %step 2)
width = [0;A(:,n)+0.0075]; %step 2); Note I added +0.0075 because we want to have data from 0 to 0.016 mm in the x axis
end
  댓글 수: 5
JD_PM
JD_PM 2022년 4월 22일
It works now, really appreciate the discussion! :)
Mathieu NOE
Mathieu NOE 2022년 4월 25일
as always, my pleasure !!

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Tables에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by