Combining multiple functions within one script

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

I figured it out. If anyone was wandering I created another function physics with an end after all the full functions were inputed. This allowed me to call the function physics. I then can call each function within the function for an answer. Probably not the best way to do it but it worked for now.
function physics
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
end
Learner
Learner 2020년 1월 15일
looks good but how to call a sub function within physcics function
The only ways to call a subfunction that is defined inside another function are:
1. Somehow obtain a handle to the subfunction. For example calling the wrapper function "physics" could return handles to the subfunctions; or
2. Have the wrapper function be a "switchyard" where you pass in information about which subfunction you want to call and the wrapper function calls it on your behalf. For example
function varargout = physics(request, varargin)
switch request
case 'grav'
[varargout{1:nargout}] = GravitationalForce(varargin{:}) ;
end
Invoke with
physics('grav', m1, m2, d)
Kazi Newaz
Kazi Newaz 2022년 2월 3일
편집: Kazi Newaz 2022년 2월 3일
I get the error Undefined function or variable. What am I doing wrong?
function varargout = addcomp(request, varargin)
function outc=addcomp1(z1,z2)
realpart=real(z1)+real(z2);
imagpart=imag(z1)+imag(z2);
outc=realpart+imagpart*1i;
end
function outc=addcomp2(z1,z2)
outc=z1+z2;
end
switch request
case 'addcomp1'
[varargout{1:nargout}]=addcomp1(varargin{:});
case 'addcomp2'
[varargout{1:nargout}]=addcomp2(varargin{:});
end
end
How are you invoking the function, and what is the complete error message?
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

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

답변 (4개)

Mohammad Askari
Mohammad Askari 2018년 6월 30일
편집: Mohammad Askari 2019년 11월 18일

16 개 추천

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

this method does not seem to work for case where a function depends on the previous one.
Any suggestions?
@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

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

Anders Bergåker
Anders Bergåker 2017년 10월 26일

5 개 추천

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

If I use this method. do I need to do any configuration for myLib.m file like import or adding path?
Like everything for MATLAB it would have to be on your MATLAB path, but you would not need to import
Nice idea! The only downside is that it creates a false warning ("this function might be unused") for every individual sub-function. Do you have a workaround for this ?
"false warning"
Add the line
%#ok<*DEFNU>
to mylib.m
Marcel
Marcel 2024년 5월 15일
Works fantastic and is elegant. Thanks!
You could also comment out the function(s) with %{ and %}.
For example:
%{
function out = MyFunction(in)
out = 2 * in;
end
%}

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

Image Analyst
Image Analyst 2017년 2월 19일

1 개 추천

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 2017년 2월 19일
편집: John D'Errico 2017년 2월 19일

0 개 추천

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

Starting with R2016b, you can have function(s) below a script all within the same m-file.

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

카테고리

도움말 센터File Exchange에서 Function Creation에 대해 자세히 알아보기

제품

질문:

2017년 2월 19일

댓글:

2024년 5월 16일

Community Treasure Hunt

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

Start Hunting!

Translated by