一、.m内部的子函数:
在一个m文件中写多个函数,每个函数都以function开始,结束可以带end,也可以不带(这种情况下,出现另一个function或者到达文件结尾表明前一个function结束).
案例1:
如果文件开头有 function + 名字;即每个子函数都不带end,即 function + name
function name
……
……
function sub_main
clc
clear all;
% 声明全局变量a,b,c
global a b c
%变量赋值
a=1;
b=2;
c=3;
d=10;
disp(10);
e=add(d)
function w=add(d)
%函数内也要声明全局变量
global a
global b
global c
w=(a+b+c)/d;
归根结底,毕竟是一个函数,在此文件运行完之后,函数生命周期结束,所有的变量都会消失;个人不建议采用这种方式;
如下所示:
案例2:
如果文件开头没有 function + 名字;即每个子函数都为:
function name
……
……
end
% function sub_main
clc;clear all;
% 声明全局变量a,b,c
global a b c
%变量赋值
a=1;
b=2;
c=3;
d=10;
disp(10);
e=add(d)
function w=add(d)
%函数内也要声明全局变量
global a
global b
global c
w=(a+b+c)/d;
end
脚本运行完毕后,脚本中函数的变量会显示:
二、调用函数文件/.m外部的子函数:
第一个函数作为主函数,可以从该m文件外部调用,其它函数都是局部函数,只能被m文件中的函数调用。主函数命名最好和m文件名相同,如果不同,则调用时应该使用m文件名(不带扩展名)。
案例1:函数内部存在子函数,并且在外部调用.m文件!
主调函数:
clear;clc;close all;
%调用其他.m文件,必须是.m的保存名!而不是.m内部的函数名;
%例如此例中:function sub_main
test_function;
被调函数:
function sub_main
% clc;clear all;
% 声明全局变量a,b,c
global a b c
%变量赋值
a=1;
b=2;
c=3;
d=10;
disp(10);
e=add(d)
function w=add(d)
%函数内也要声明全局变量
global a
global b
global c
w=(a+b+c)/d;
即:必须写:test_function; 写function sub_main 是错误的!
1、非嵌套定义:
需要注意的是,调用的外部文件,如果文件内部,存在调用子函数的情况,则文件内的主调函数和被调函数有两种形式,但是必须统一,如下所示:
方式1 方式2
function name function name
…… ……
…… ……
end
subfunction name subfunction name
…… ……
…… ……
end
2、嵌套定义:
存在的问题就是:一定要注意变量的命名,避免出现问题。
方式1 方式2
function mainFunc() function mainFunc()
…… ……
a = myfunc1(); a = myfunc1();
function myfunc1() ...
... end
end function myfunc1()
…… ...
end end
三、脚本文件和函数文件
1、脚本文件:
脚本文件可以理解为简单的M文件,脚本文件中的变量都是全局变量。函数文件是在脚本文件的基础之上多添加了一行函数定义行,其代码组织结构和调用方式与对应的脚本文件截然不同。
脚本文件只是将一系列相关的代码结合封装,没有输入参数和输出参数,即不自带参数,也不一定要返回结果。而多数函数文件一般都有输入和输出变量,并见有返回结果。
M脚本文件创建的每个变量都会保存到Matlab工作区,
2、函数文件:
函数文件是以函数声明行“function...”作为开始的,其实质就是用户往MATLAB函数库里边添加了子函数,函数文件中的变量都是局部变量,除非使用了特别声明。函数运行完毕之后,其定义的变量将从工作区间中清除(声明周期结束)。
M函数文件只有输出结果才保存到Matlab工作区中;
注意:
(1)函数文件的命名要使用文件内主函数声明的名称,否则出错。现在高版本matlab中文件命名可以与主函数名不一样。
(2)函数内部可以嵌套子函数并为该文件的主函数调用,只需将子函数写在主函数代码后面。
(3)一个函数可以有多个输入输出。如function [y1,y2]=myfun(x1,x2,x3)
一般来说matlab中执行同样的任务使用函数文件比脚本文件的效率高。
参考: