Matlab變數的一個核心思想就是絕大多數時候資料都是由矩陣來儲存的,所以輸入常常也考慮為向量而不僅僅是一個數。包括在找滿足條件的數的時候,我們通常也是用一個向量儲存(也就是陣列,但表示方式有些許差異)然後把資料放到向量裡,

向量長度

也自然擴張了。

Matlab中的函式如果傳入的是向量,返回的多半是一個值,如果傳入的是矩陣,返回的多半是列滿足條件的值組成的行向量。

今日簡單題:編寫一個函式能夠計算下列分段函式在多個節點的函式值:

  f(x)=\begin{cases}(x-1)^2,x≤-1,\\x^2,-1<x<1,\\(x+1)^2,x>1. \end{cases}

Matlab入門3-計算分段函式的值

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