Effacer les filtres
Effacer les filtres

Combining multiple functions within one script

227 vues (au cours des 30 derniers jours)
Brooks Nelson
Brooks Nelson le 19 Fév 2017
Commenté : Image Analyst le 16 Mai 2024
I have three functions I would like to put into one script. What would be the correct steps to do so. here are the following functions I have written.
function [] = gravitationalForce(m1,m2,d)
%{m1 = mass 1, m2 = mass 2, d = distance%}
G = 6.672 * 10^11;
syms F
F = (G*m1*m2/(d^2));
display(F)
end
function [] = velocityCalc(u,a,s)
%{u = velocity,a = acceleration,s = distance traveled%}
disp('V^2 =')
v = (u^2 + (2*a*s));
disp(v)
end
function [] = distanceTraveled(u,a,t)
%{u = velocity,a = acceleration,t = time%}
syms s
s = (u*t)+1/2*a*t^2;
display(s)
end
  6 commentaires
Walter Roberson
Walter Roberson le 3 Fév 2022
How are you invoking the function, and what is the complete error message?
Kazi Newaz
Kazi Newaz le 3 Fév 2022
extremely sorry to have bothered you, it was an issue with me not having the path set up right, now it is working, thank you so much for the solution

Connectez-vous pour commenter.

Réponses (4)

Mohammad Askari
Mohammad Askari le 30 Juin 2018
Modifié(e) : Mohammad Askari le 18 Nov 2019
Another approach is to create a class with static methods with all your sub-functions. Save the following code as ALLFUNCS.m
classdef ALLFUNCS
methods(Static)
function result = SumElements(a,b,c)
result = a + b + c;
end
function [prod,div] = MultiplyDivide(v1,v2,v3)
prod = v1 * v2 * v3;
div = v1 / v2 / v3;
end
end
end
Then you can simply call the sub-functions like this:
s = ALLFUNCS.SumElements(3,4,5);
[p,d] = ALLFUNCS.MultiplyDivide(8,3,5);
  2 commentaires
leanne dong
leanne dong le 2 Avr 2020
this method does not seem to work for case where a function depends on the previous one.
Any suggestions?
Mohammad Askari
Mohammad Askari le 3 Avr 2020
Modifié(e) : Mohammad Askari le 31 Oct 2021
@leanne dong, it actually does. In the example below, the first function calls the other one. Is this what you are looking for?
classdef ALLFUNCS
methods(Static)
function result = SumElements(a,b,c)
result = a + b + c;
string = ALLFUNCS.IsGreaterThanZero(result);
disp(['the answer is greater than zero: ',string]);
end
function str = IsGreaterThanZero(value)
if value > 0
str = 'true';
else
str = 'false';
end
end
end
end

Connectez-vous pour commenter.


Anders Bergåker
Anders Bergåker le 26 Oct 2017
Well, I find this limitation incredibly annoying so I use a workaround with the sfunc command. The first function takes the function you actually want to call as an argument. I've found this workaround ages ago, it might have some drawbacks I'm unaware of since I'm not an Matlab expert.
Put all this code in an .m file, eg. myLib.m which then will act as a function library. The call to use a specific function would then be:
myLib('distanceTraveled', u, a, t)
It work fine with returnvalues as well. Examaple of myLib.m:
function varargout = sfunc(varargin)
[varargout{1:nargout}] = feval(varargin{:});
end
function [] = gravitationalForce(m1,m2,d)
...
end
function [] = velocityCalc(u,a,s)
...
end
function [] = distanceTraveled(u,a,t)
...
end
  6 commentaires
Marcel
Marcel le 15 Mai 2024
Works fantastic and is elegant. Thanks!
Image Analyst
Image Analyst le 16 Mai 2024
You could also comment out the function(s) with %{ and %}.
For example:
%{
function out = MyFunction(in)
out = 2 * in;
end
%}

Connectez-vous pour commenter.


Image Analyst
Image Analyst le 19 Fév 2017
You can do that but velocityCalc() and distanceTraveled() would only be available/seen to functions within the same file. If they need to be used by other m-files, you'd have to have them in separate files, unless they were a class. I've done this so I know it works. If you had a class with those functions in it, then any file could call any of those functions as a static method of the class.

John D'Errico
John D'Errico le 19 Fév 2017
Modifié(e) : John D'Errico le 19 Fév 2017
If your goal is to use those function independently, then they need to be saved as separate m-files, NOT in one large file. While it would indeed be possible to do that in theory, you would need to learn a fair amount about function handles to do so. As well, you would need to call a main function, then having it return function handles for each sub-function that you might call in the future.
If you are somehow thinking of having an actual script that also has a mainline, but with functions defined within, that is not possible. Scripts cannot also contain function definitions, except for the case of function handles created in one line.
Simple save each function as an independent m-file.
  1 commentaire
Image Analyst
Image Analyst le 19 Fév 2017
Starting with R2016b, you can have function(s) below a script all within the same m-file.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Simulink Environment Customization dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by