Matlab中函數定義方法
Matlab自定義函數的六種方法
n1、函數文件+調用函數(命令)文件:需單獨定義一個自定義函數的M文件;
n2、函數文件+子函數:定義一個具有多個自定義函數的M文件;
n3、Inline:無需M文件,直接定義;
n4、匿名函數;
n5、Syms+subs:無需M文件,直接定義;
n6、字符串+subs:無需M文件,直接定義。
------------
1、函數文件+調用函數文件:定義多個M文件
% 調用函數文件:myfile.m
clear
clc
for t=1:10
y=mylfg(t);
fprintf(‘M^(1/3)=%6.4fn’,t,y);
end
%自定義函數文件:mylfg.m
function y=mylfg(x) %注意:函數名(mylfg)必須與文件名(mylfg.m)一致
Y=x^(1/3);
注:這種方法要求自定義函數必須單獨寫一個M文件,不能與調用的命令文件寫在同一個M文件中。
2、函數文件+子函數:定義一個具有多個子函數的M文件
%命令文件:funtry2.m
function []=funtry2()
for t=1:10
y=lfg2(t)
fprintf(‘M^(1/3)=%6.4fn’);
End
function y=lfg2(x)
Y= x^(1/3);
%注:自定義函數文件funtry2.m中可以定義多個子函數function。子函數lfg2只能被主函數和主函數中的其他子函數調用。
注意:函數定義格式
在matlab中應該做成M文件,文件名要和你文件里的function后面的函數名一致,在File新建一個M-file 在M-file里編輯函數,其格式為:
function [輸出實參表]=函數名(輸入實參數)
注釋部分
函數體語句
return語句(可以有可以沒有)
如果是文件中的子函數,則可以任意取名,也可以在同一個文件中定義多個子函數:
例: function [max,min]=mymainfun(x) %主函數
n=length(x);
max=mysubfun1(x,n);
min=mysubfun2(x);
function r=mysubfun1(x,n) %子函數1
x1=sort(x);
r=x1(n);
function r=mysubfun2(x) %子函數2
x1=sort(x);
r=x1(1);
詳細見后文:matlab中同一文件定義子函數的方法
【說明】可以將一個主函數和多個子函數寫在一個m文件中,文件名是主函數名,第一個函數是主函數,后面跟的函數都是這個函數中需要調用的子函數或者子子函數。即該文件必須是以function打頭的函數文件,不能是前面不是函數,后面跟一串函數。強調一下,前面是命令后面加函數是不行的,必須前面也是函數!前面無參數輸入的而是一段命令,直接將這些命令定義為一個無參數的函數就可以了。
3、Inline:無需M文件,直接定義
%inline命令用來定義一個內聯(lián)函數:f=inline(‘函數表達式’,‘變量1’,’變量2’,……)。
調用方式:y=f(數值列表)%注意:代入的數值列表順序應與inline()定義的變量名順序一致。
例如:
f=inline(‘x^2+y’,’x’,’y’);
z=f(2,3)
Ans=7
注:這種函數定義方式是將它作為一個內部函數調用。特點是,它是基于Matlab的數值運算內核的,所以它的運算速度較快,程序效率更高。缺點是,該方法只能對數值進行代入,不支持符號代入,且對定義后的函數不能進行求導等符號運算。
例:
Clear
Clc
f=’x^2’;
Syms x g;
g=x^2;
h=inline(‘x^2’,’x’);
4. 匿名函數
使用matlab函數句柄操作符@,可以定義指向matlab內置函數和用戶自定義函數的函數句柄,函數句柄也可以像函數一樣的使用。例如:
>>x=-pi:0.1:pi;
>>fh={@cos,@sin};
fh =
@cos@sin
>>plot(fh{2}(x))
5、Syms+subs:無需M文件,直接定義
用syms定義一個符號表達式,用subs調用:
Syms f x%定義符號
f=1/(1+x^2);%定義符號表達式
subs(f,‘x’,代替x的數值或符號)
注:對于在syms中已經定義過的符號變量,在subs中進行替代時,單引號可以省略。但是,如果在syms后又被重新定義為其他類型,則必須加單引號,否則不可替換。
這種函數定義方法的特點是,可以用符號進行替換
Syms f x
f=1/(1+x^2);
subs(f,‘x’,’y^2’)
ans=
1/(1+(y^2)^2)
注:該方法的缺點是,由于使用符號運算內核,運算速度會大大降低。
6、字符串+subs:無需M文件,直接定義
直接定義一個字符串,用subs命令調用。例如:
f=’1/(1+x^2)’%定義字符串
z=subs(f,’x’,2)
g=subs(f,’x’,’y^2’)
注:優(yōu)點是,占用內存最少,定義格式方面自由。
缺點是,無法對字符進行符號轉化。
當所要替代的符號在調用前都已經有了數值定義,則可以直接調用:subs(f).例如:
f=’x^2*y’;
x=2;y=3;
subs(f)
ans=12
-------------------------------------------
詳細:Matlab中同一文件定義子函數的方法
有時子函數可能很短,就幾行,可能希望將多個函數定義放在同一個.m文件中,這里就存在一個子函數的定義問題。
在matlab中一個.m文件中可以有多個的子函數,但僅能有一個主函數,并且M文件名必須和主函數相同
在一個m文件中通常有兩種定義子函數的方法:
1.嵌套定義
functionmainFunc()
...
a=myfunc1();
...
functionmyfunc1()
...
end
end
2.非嵌套定義
functionmainFunc()
...
a=myfunc1();
...
end
functionmyfunc1()
...
end
在第二種情況中,myfunc1和主函數就是兩個獨立的函數,和把它們寫在兩個獨立的文件
中沒有差別。變量名想怎么起怎么起,不會有任何沖突。
![[整理]Matlab中函數定義方法 matlab 定義函數](http://img.aihuau.com/images/01111101/01093236t01d7111582edf713be.jpg)
而第一種情況中,myfunc1會和主函數共享變量名。這種情況下,使用相同的變量名,如
果不是故意為之,就不合適了。
對于嵌套函數,函數定義中的end必不可少。
例子:
下面是某個.m腳本文件(son_function.m文件)中的內容:
%%-----------------------------------------------------------------------
function son_function()%主函數必須位于最上方
%子函數舉例
max1=find_max(1,2,3)
max2=find_max(7,3,9)
functionmax=find_max(a,b,c)%子函數
if(a>=b)&(a>=c)
max=a;
elseif(b>=a)&(b>=c)
max=b;
else
max=c;
end
%%-----------------------------------------------------------------------
注意:
M文件中將函數的調用直接寫到m腳本文件中的情況是不允許的,必須也把調用寫成函數的形式,或者將子函數都寫成單獨的m文件。
如將上程序中的第一行屏蔽掉,即
% function son_function()
會出現下面的錯誤
Functiondefinitions are not permitted at the prompt or inscripts.
---------------------------------
下面一段文字是摘自matlab幫助中的一段文字:end在function中的使用
endalso marks the termination of an M-filefunction, although in most cases, it is optional. end statementsare required only in M-files that employ one or more nestedfunctions. Within such an M-file, every function (includingprimary, nested, private, and subfunctions) must be terminated withan end statement. You can terminate any function type with end, butdoing so is not required unless the M-file contains a nestedfunction
盡管大多數情況下,end在function的用法是可選的,但也可以用它標記一個M文件函數的結束。end語句僅在使用一個或多個嵌套函數的情況下才是要求的。在諸如此類嵌套函數的M-文件中,每一個函數(包括主調函數,嵌套函數,私有函數和子函數)必須以一個end語句來結束。可以使用end結束任一函數類型,但這樣做除了M-文件包含一個嵌套函數其他情況并非必要的。
愛華網



