Matlab入門3-計算分段函式的值
Matlab變數的一個核心思想就是絕大多數時候資料都是由矩陣來儲存的,所以輸入常常也考慮為向量而不僅僅是一個數。包括在找滿足條件的數的時候,我們通常也是用一個向量儲存(也就是陣列,但表示方式有些許差異)然後把資料放到向量裡,
向量長度
也自然擴張了。
Matlab中的函式如果傳入的是向量,返回的多半是一個值,如果傳入的是矩陣,返回的多半是列滿足條件的值組成的行向量。
今日簡單題:編寫一個函式能夠計算下列分段函式在多個節點的函式值:
Matlab的簡單繪圖
所需知識:
a。如何寫一個函式(包括輸入引數輸出、引數表示等)。b。表示分段函式的三種方式(注意本題的要求)。c。選擇分支的表示方法。
事先需要準備的:建立函式檔案並將其命名為與主函式完全相同的名字(否則執行不了)
我們給出兩種解答(
inline函式
不介紹,後來版本被移除),藉此引出一般函式表示:
function
s
=
myfunction
(
x
)
%主函式,推薦創立函式檔案而不是指令碼檔案
s
=
zeros
(
size
(
x
));
%生成一個與x同型的0向量
for
i
=
1
:
length
(
x
)
%迴圈體的使用
s
(
i
)=
mycal
(
x
(
i
));
%x(i)是引用第i個元素
end
function
r
=
mycal
(
x
)
%子函式,已知節點x,計算分段函式值
if
x
<
=
-
1
r
=(
x
-
1
)
^
2
;
%不用點乘的原因?
elseif
x
<
1
r
=
x
^
2
;
else
r
=(
x
+
1
)
^
2
;
end
第二種:
f
=@(
x
)((
x
<
=
-
1
)
。*
((
x
-
1
)
。^
2
)
+
(
x
>-
1
&&
x
<
1
)
。*
(
x
。^
2
)
+
(
x
>
1
)
。*
((
x
+
1
)
。^
2
));
%匿名函式,一般放在指令碼檔案中或者命令列窗口裡。
我們先從函式框架入手:
1.語法一:function [輸出引數列表]=函式名[輸入引數列表](引數用逗號分離)
例如:function [y,z]=myfunction(x)%這裡x就是輸入引數,y和z就是輸出的引數(若無global宣告,x、y、z為
區域性變數
)。
注意:
命名
:儲存引數名的檔案命名要與函式名相同,否則以檔名為函式名來呼叫
;
函式名不能與已經存在的函式重名,用doc檢查自己命名的函式是否存在
;
如果在指令碼檔案中定義函式(R2016b以後的版本可以做到),那麼指令碼檔案不能與函式名相同;
子函式
:函式檔案可以包含一個以上的函式。除了第一個函式之外的函式都叫做子函式,子函式只能被同一個函式檔案中的函式呼叫。
關於關鍵字end:建議無論何時都在函式末尾加上end。
2.語法二:匿名函式,f=@(引數列表)(函式表示式)
例如:f=@(x)(x^2)
注意:
應用場景
:匿名函式通常在指令碼檔案中或命令列中被建立,由於形式簡單便於構建繪圖中的函式,或者
複合函式
,或者微積分的計算
然後是一些基礎函式使用:
3.建立全零陣列:zeros
基本語法:zeros(n)、zeros(size(x))、zeros(m,n)
zeros(n)%返回一個n×n的全零矩陣
zeros(size(x))%返回一個由零組成的陣列,大小與x相同
zeros(m,n)%返回一個m×n的全零矩陣,可指定零資料型別,例如zeros(1,3,‘uint32’)指定元素為32位無符號型整數。
4.陣列大小:size
基本語法:sz=size(A)、szdim=size(A,dim)、[m,n]=size(A)
size(A)%返回一個行向量,元素包含A的相應維度的長度,例如
二維陣列
就返回[行數,列數],這也就解釋了上例中zero(size(A))的用法;加dim也就是指定維度返回長度了。
5.選擇、迴圈、分支等結構簡述
語法:
if 條件1 語句1 //elseif 條件2 語句2//else 條件3 語句3// end %elseif無空格分離。值得一提的是
error(引發錯誤並顯示錯誤訊息)
:
基本語法:error(msg)%例如error(‘
error occurred
’);如果需要在裡面使
跳脫字元
生效的話,必須要為error指定多個引數,在錯誤訊息中包含帶變數n的類的資訊(由於沒有引入基本變數型別,故暫時不論),通常用於if ~某個條件//error
for 迴圈條件(例如i=1:5) // 迴圈體 //end %不用大括號,有幾個for就有幾個end
while
邏輯表示式
//語句塊//end
switch
開關表示式
//case 表示式1
,
//語句塊1//case {
表示式
2,表示式3,。。。}
,
//語句塊2//
otherwise,
//語句塊//end %注意逗號與otherwise還有end
continue、break
其餘就很容易建立一個函數了。matlab有些地方其實給我的感覺怪怪的。。。感覺是功能太多反而容易混?不過可以隨時doc查詢,但自己還是得對基本的函式功能組合熟悉起來,否則用的時候會很難受。
以下再補充兩個定義函式的東西:nargin、nargout,也是重點把握內容,有助於理解呼叫函式使用的規律。
函式輸入引數數目:nargin、函式輸出引數數目:nargout
共同說明:兩者僅針對現在正在進行中的函式,該語法僅可在函式體內使用,返回函式呼叫中給定輸入/輸出引數數目
例子:
[1]
function
c
=
addme
(
a,b
)
switch
nargin
case
2
%假如有兩個輸入,例如addme(1,2)
c
=
a
+
b
;
case
1
%假如只有一個輸入,例如addme(1)
c
=
a
+
a
;
otherwise
c
=
0
;
end
end
function
[dif,absdif]
=
subtract
(
y,x
)
dif
=
y
-
x
;
if
nargout
>
1
%假如使用一個返回值,輸出參量就只有dif,如果使用兩個返回值久有absdif
disp
(
‘Calculating absolute value’
)
%disp是顯示其後內容的函式,後續在知識補全再說
absdif
=
abs
(
dif
);
%例如a=subtract(3,2)和[a,b]=subtract(3,2),使用參照max
end
end
如果nargin(函式名)的話返回值就是該函式可以接受的最大引數個數,同理nargout就是最大輸出參量個數。
Matlab中還有一個函式piecewise可以直接建立分段函式:
命令:
syms y(x);
%這裡可以用assume(x>0)來限制
定義域
的範圍
y(x) = piecewise(x<0,1,x=0,2,x>0,3);
%接下來就可以愉快地呼叫piecewise了
%還可以用subs調整自變數的範圍:pw=subs(pw,x<-1,x<0);
%可以借符號計算,diffpw=diff(pw,x);
參考
^
來自官方文件
https://ww2。mathworks。cn/help/matlab/ref/nargin。html