How to store values from a loop?

조회 수: 5 (최근 30일)
Edward Apraku
Edward Apraku 2023년 6월 14일
답변: Naman 2023년 6월 14일
I have a code that loops through multiple DTA text files and graphs them together. I want to save the average value of V_f from each iteration but am currently stuck becuase it keeps overwriting and only saves the average V_f from the last DTA file.
clear all; clc; close all;
[filename,pathname]=uigetfile('*.DTA','MultiSelect','on');
numCPs=length(filename);
if numCPs>10
numCPs=1;
end
figure
ax=axes;
ax.Box='on';
ax.LineWidth=1.5;
ax.XAxis.FontSize=20; ax.XLabel.FontSize=20;
ax.YAxis.FontSize=20; ax.YLabel.FontSize=20;
hold on
for count=1:1:numCPs
if numCPs>1
CPdata=importdata(fullfile(pathname,filename{count}),' ');
else
CPdata=importdata(fullfile(pathname,filename),' ');
end
temp=strsplit(CPdata{15});
endIndex=length(CPdata);
for i=1:length(CPdata)
temp=strsplit(CPdata{i});
if temp{1}=="CURVE"
startIndex=i+3;
end
endIndex=i-1;
end
data=[];
for i=startIndex:endIndex
temp=strsplit(CPdata{i});
data=[data;str2num(temp{3}),str2num(temp{4})];
end
Time=data(:,1); %time
V_f=data(:,2); %ohm
V_favg=mean(data(:,2));
if numCPs>1
plot(Time,V_f,'-o','MarkerSize',2,'LineWidth',3,'DisplayName',filename{count});
else
plot(Time,V_f,'-o','MarkerSize',2,'LineWidth',3,'DisplayName',filename);
end
xlabel("Time (s)"); ylabel("V_f (V vs. Ref.)");
end
legend('AutoUpdate','off');
axis square;
axis([0 7200 0 10])
hold off
  댓글 수: 1
Stephen23
Stephen23 2023년 6월 14일
Note that you can replace this fragile code:
numCPs=length(filename);
if numCPs>10
numCPs=1;
end
..
for count=1:1:numCPs
if numCPs>1
CPdata=importdata(fullfile(pathname,filename{count}),' ');
else
CPdata=importdata(fullfile(pathname,filename),' ');
end
..
end
with this simpler and much more robust code:
filename = cellstr(filename);
..
for count = 1:numel(filename)
CPdata = importdata(fullfile(pathname,filename{count}),' ');
..
end

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

채택된 답변

Sanskar
Sanskar 2023년 6월 14일
From your question I got that you want to get all the average value but it overwrites the previous one.
Since, in the following line you are updating the V_favg in every iteration so it overwrites.
V_favg=mean(data(:,2));
To store the average value, you can create an empty 1-D array, before you start the loop and you can append the average value from every iteration to that array.
....
ax.LineWidth=1.5;
ax.XAxis.FontSize=20; ax.XLabel.FontSize=20;
ax.YAxis.FontSize=20; ax.YLabel.FontSize=20;
hold on
V_favg = []; % initialize empty array
for count = 1:1:numCPs
...
...
Time=data(:,1); %time
V_f=data(:,2); %ohm
V_favg(end+1)=mean(data(:,2)); %Appending to initialized array
if numCPs>1
plot(Time,V_f,'-o','MarkerSize',2,'LineWidth',3,'DisplayName',filename{count});
else
plot(Time,V_f,'-o','MarkerSize',2,'LineWidth',3,'DisplayName',filename);
end
xlabel("Time (s)"); ylabel("V_f (V vs. Ref.)");
...
...
end
Happy to help you,
Sanskar

추가 답변 (2개)

Aman
Aman 2023년 6월 14일
Hi Edward,
To save the average V_f value from each DTA file, you can create an array V_favg_all to store the average values.
Here's an updated version of your code that includes this modification:
clear all; clc; close all;
[filename,pathname]=uigetfile('*.DTA','MultiSelect','on');
numCPs=length(filename);
if numCPs>10
numCPs=1;
end
figure
ax=axes;
ax.Box='on';
ax.LineWidth=1.5;
ax.XAxis.FontSize=20; ax.XLabel.FontSize=20;
ax.YAxis.FontSize=20; ax.YLabel.FontSize=20;
hold on
V_favg_all = []; % initialize array to store average V_f values
for count=1:1:numCPs
if numCPs>1
CPdata=importdata(fullfile(pathname,filename{count}),' ');
else
CPdata=importdata(fullfile(pathname,filename),' ');
end
temp=strsplit(CPdata{15});
endIndex=length(CPdata);
for i=1:length(CPdata)
temp=strsplit(CPdata{i});
if temp{1}=="CURVE"
startIndex=i+3;
end
endIndex=i-1;
end
data=[];
for i=startIndex:endIndex
temp=strsplit(CPdata{i});
data=[data;str2num(temp{3}),str2num(temp{4})];
end
Time=data(:,1); %time
V_f=data(:,2); %ohm
V_favg=mean(data(:,2));
V_favg_all = [V_favg_all V_favg]; % append the new V_favg to the end of the V_favg_all array
if numCPs>1
plot(Time,V_f,'-o','MarkerSize',2,'LineWidth',3,'DisplayName',filename{count});
else
plot(Time,V_f,'-o','MarkerSize',2,'LineWidth',3,'DisplayName',filename);
end
xlabel("Time (s)"); ylabel("V_f (V vs. Ref.)");
end
legend('AutoUpdate','off');
axis square;
axis([0 7200 0 10])
hold off
The average of each iteration is stored in the V_favg_all array.
Hope this Helps!

Naman
Naman 2023년 6월 14일
Hi Edward,
Here you are overriding the V_favg value with every iteration of for loop
V_favg=mean(data(:,2));
Instead create an array V_favg initially outside the for loop.
% Declaring V_favg2 vector outside the for loop.
V_favg = zeros(1,numCPs) ;
and keep storing average of V_f in it with each iteration of for loop.
% saving the average value of V_f from each iteration into V_favg array
V_favg(count) = mean(data(:,2)) ;
Hope it will help you.

카테고리

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

태그

제품


릴리스

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by