problem plotting from function call

2 views (last 30 days)
I can perform two seperate overlay plots with the included script, but would like to call it from a function to make it more portable before i extend it. However, the function call only works with the full complement of arguments (as is).
Why can't i use global to reduce 3 potentially unecessary arguments (D,Fn,of)?
When i try they do not get recognised! How might i cure this?

Accepted Answer

Star Strider
Star Strider on 18 Oct 2023
In general, global variables are not considered good programming practice, principally because the functions they are passed to can have the ability to change them. This makes debugging difficult. Passing them as parameters avoids this, because if a function changes the value of a parameter, it does so only within its own workspace, not globally. The value pased as a parameter doesn’t change unless the function specifically changes it and returns the changed value to the workspace as an output.
I added the ‘readFixedWidthFile’ function to read the fixed-width files in order to put the NaN values in the correct positions.
Try this —
clear, clc, close all
Uz = unzip('https://www.mathworks.com/matlabcentral/answers/uploaded_files/1514334/Script.zip')
Uz = 1×4 cell array
{'ofih1.txt'} {'ofih2.txt'} {'ofih3.txt'} {'Script.m'}
n = 3;
name = 'ofih';
D{3,1} = [];
fn{3,1} = [];
fullname = strcat(name,'%d.txt');
isp = 'Specific impulse I_{sp} [s]';
ispof = 'Specific impulse versus mixture ratio';
cstar = 'Characteristic velocity c* [m/s]';
cstarof = 'Characteristic velocity versus mixture ratio';
of = 'Mixture ratio (o/f)_m';
for k = 1:n
% filename = sprintf(fullname, k);
% fn{k,:} = filename;
fn{k,:} = Uz{k};
A = readFixedWidthFile(fn{k});
% fidi = fopen(filename,'rt');
% C = textscan(fidi, '%f%f%f', 'HeaderLines',3, 'CollectOutput',1);
% A = cell2mat(C);
D{k,:} = A(1:size(A,1)-3,:);
end
% fclose(fidi);
%
% Out = cell2mat(D);
figure('name','isp')
hold on
for k = 1:numel(D)
plot(D{k}(:,1), D{k}(:,2))
title(ispof)
xlabel(of)
ylabel(isp)
end
hold off
grid
legend(fn,'Location','best')
figure('name','cstar')
hold on
for k = 1:numel(D)
plot(D{k}(:,1), D{k}(:,3))
title(cstarof)
xlabel(of)
ylabel(cstar)
end
hold off
grid
legend(fn,'Location','best')
plotting('isp',isp,ispof,2,D,fn,of);
D {21×3 double} {18×3 double} { 8×3 double} fn {'ofih1.txt'} {'ofih2.txt'} {'ofih3.txt'} of Mixture ratio (o/f)_m
plotting('cstar',cstar,cstarof,3,D,fn,of);
D {21×3 double} {18×3 double} { 8×3 double} fn {'ofih1.txt'} {'ofih2.txt'} {'ofih3.txt'} of Mixture ratio (o/f)_m
function [] = plotting(name1,name2,name3,n,D,fn,of)
%global D fn of
figure('name',name1)
hold on
for k = 1:numel(D)
plot(D{k}(:,1), D{k}(:,n))
title(name3)
xlabel(of)
ylabel(name2)
end
hold off
grid
legend(fn,'Location','best')
disp('D')
disp(D)
disp('fn')
disp(fn)
disp('of')
disp(of)
end
function DataMatrix = readFixedWidthFile(filename)
opts = fixedWidthImportOptions('NumVariables',3, 'VariableWidths',[15 16 16], 'DataLines',[4 25; 27 28]);
T1 = readtable(filename, opts);
% T1(end-1:end,:)
% % missing = varfun(@ismissing, T1);
% % missing(end-1:end,:)
T2 = varfun(@(x)fillmissing(x,'constant',{'NaN'}), T1);
% T2(end-1:end,:)
%
% format longG
% A = str2double(table2array(T2))
% A(end-1:end,:)
DataMatrix = str2double(table2array(T2));
end
% ========= END: Brantosaurus_2023_10_18.m ==========
.
  2 Comments
Brantosaurus
Brantosaurus on 18 Oct 2023
Moved: Star Strider on 18 Oct 2023
Thanks for this and the advice on global. I much appreciate it. Unfortunately fixedWidthImportOptions is not available in 2017a despite the claims :(
I can dispense with the footer data. Its not a real issue. So i probably need to go with the script as it stands without global and the extra arguments?
Star Strider
Star Strider on 18 Oct 2023
My pleasure!
Definitely without global. Always pass the extra arguments if you need to (if the function needs them), since that works.
The problem with not having access to the R2017a documentation is that I was not aware of that limitation. My apologies.

Sign in to comment.

More Answers (0)

Products


Release

R2017a

Community Treasure Hunt

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

Start Hunting!