MATLAB02:结构化编程和函数定义「建议收藏」
大家好,又見(jiàn)面了,我是你們的朋友風(fēng)君子。
pdf版本筆記的下載地址: MATLAB02_結(jié)構(gòu)化編程和函數(shù)定義(訪問(wèn)密碼:3834)
學(xué)習(xí)一門(mén)技術(shù)最好的方式就是閱讀官方文檔,可以查看MATLAB官方文檔
結(jié)構(gòu)化編程
流程控制語(yǔ)句和邏輯運(yùn)算符
與大多數(shù)編程語(yǔ)言相同,MATLAB有以下流程控制語(yǔ)句:
| 流程控制語(yǔ)句 | 作用 |
|---|---|
if, elseif, else |
若if語(yǔ)句為真,則執(zhí)行子句 |
switch, case, otherwise |
根據(jù)switch語(yǔ)句內(nèi)容判斷執(zhí)行哪個(gè)子句 |
while |
重復(fù)執(zhí)行子句直到while中的條件為假 |
for |
執(zhí)行子句固定次數(shù) |
try, catch |
執(zhí)行子句并捕獲執(zhí)行過(guò)程中的異常 |
break |
跳出循環(huán) |
continue |
直接進(jìn)入下一次循環(huán) |
end |
結(jié)束子句 |
pause |
暫停程序 |
return |
返回到調(diào)用函數(shù)處 |
上述所有循環(huán)和條件語(yǔ)句都要在末尾以
end閉合.
MATLAB還有以下邏輯運(yùn)算符:
| 運(yùn)算符 | 意義 |
|---|---|
< |
小于 |
<= |
小于或等于 |
> |
大于 |
>= |
大于或等于 |
== |
等于 |
~= |
不等于 |
&& |
且 |
|| |
或 |
&&和||運(yùn)算符支持邏輯短路功能.
流程控制語(yǔ)句示例
下面演示各流程控制語(yǔ)句:
-
if語(yǔ)句:if rem(a, 2) == 0 disp('a is even'); else disp('a is odd'); end -
switch語(yǔ)句:switch input_num case -1 disp('negative 1'); case 0 disp('zero'); case 1 disp('positive 1'); otherwise disp('other value'); end -
while語(yǔ)句:n = 1; while prod(1:n) < 1e100 n = n + 1; end -
for語(yǔ)句:for n=1:10 a(n)=2^n; end disp(a) -
break語(yǔ)句:x = 2; k = 0; error = inf; error_threshold = 1e-32; while error > error_threshold if k > 100 break end x = x - sin(x)/cos(x); error = abs(x - pi); k = k + 1; end
使用循環(huán)語(yǔ)句應(yīng)盡量預(yù)先分配內(nèi)存空間
若一個(gè)變量所需要的內(nèi)存空間是一個(gè)可預(yù)測(cè)的定值,我們應(yīng)盡量提前為其分配內(nèi)存空間.
以下面兩段程序?yàn)槔?演示這一點(diǎn):
-
程序一:
tic for ii = 1:2000 for jj = 1:2000 A(ii,jj) = ii + jj; end end toc程序輸出
Elapsed time is 4.616199 seconds. -
程序二:
tic A = zeros(2000, 2000); % 預(yù)先為變量分配內(nèi)存空間 for ii = 1:size(A,1) for jj = 1:size(A,2) A(ii,jj) = ii + jj; end end toc程序輸出
Elapsed time is 2.786401 seconds.
可以看到,程序一比程序二所用的時(shí)間更長(zhǎng).這是因?yàn)? 對(duì)于程序一,沒(méi)有預(yù)先為變量A分配內(nèi)存,因此每當(dāng)A的形狀發(fā)生改變時(shí),都需要重新為A分配內(nèi)存地址,這花費(fèi)了更多的時(shí)間.
編寫(xiě)腳本時(shí)應(yīng)注意的問(wèn)題
在腳本開(kāi)頭應(yīng)添加語(yǔ)句清空工作區(qū)
在每個(gè)腳本的開(kāi)頭,應(yīng)添加下述語(yǔ)句,清空工作區(qū)緩存以及之前程序運(yùn)行的痕跡:
clear all % 清空工作區(qū)內(nèi)存中的變量
close all % 關(guān)閉之前程序繪制的圖像
clc % 清空之前程序在終端的輸出
在運(yùn)算和賦值語(yǔ)句后應(yīng)添加分號(hào);抑制輸出
在所有運(yùn)算和賦值語(yǔ)句都應(yīng)該添加分號(hào);抑制輸出,若需要向終端輸出一個(gè)變量,應(yīng)對(duì)其調(diào)用disp方法.
使用省略號(hào)...拼接多行語(yǔ)句
在MATLAB中,省略號(hào)...可以將多行語(yǔ)句拼接為一行,靈活使用該語(yǔ)句可以提高代碼可讀性.
annPoints_sampled = annPoints(annPoints(:,1)>x1 & ...
annPoints(:,1) < x2 & ...
annPoints(:,2) > y1 & ...
annPoints(:,2) < y2);
函數(shù)
與其他語(yǔ)言相似,MATLAB也可以定義函數(shù).與腳本類(lèi)似,函數(shù)可以被存入函數(shù)名.m文件中,也可以以函數(shù)句柄的形式定義在內(nèi)存中.
查看內(nèi)置函數(shù)
我們可以使用which命令查看內(nèi)置函數(shù)源代碼文件的位置,與edit命令結(jié)合可以查看內(nèi)置函數(shù)的源代碼.
運(yùn)行下面語(yǔ)句可以打開(kāi)MATLAB內(nèi)置的mean函數(shù)的源文件:
edit(which('mean.m'))
可以在編輯器中看到mean函數(shù)的源代碼如下:
以函數(shù)名.m文件形式定義函數(shù)
在MATLAB文件中定義函數(shù)的格式如下:
function [輸出變量名] = 函數(shù)名(輸入變量名)
% 函數(shù)的文檔
函數(shù)代碼
function是一個(gè)關(guān)鍵字,聲明該文件中保存的是一個(gè)函數(shù).輸入變量和輸出變量是非必須的,函數(shù)既可以沒(méi)有輸入變量,也可以沒(méi)有輸出變量.函數(shù)名應(yīng)與.m文件名相同,且不包含特殊字符(最好不要有中文).
MATLAB內(nèi)置的函數(shù)參數(shù)
在MATLAB中,內(nèi)置了一些函數(shù)參數(shù)如下:
| 函數(shù)參數(shù) | 意義 |
|---|---|
imputname |
輸入變量名列表 |
mfilename |
函數(shù)源代碼文件名 |
nargin |
輸入變量數(shù) |
nargout |
輸出變量個(gè)數(shù) |
varargin |
可變長(zhǎng)輸入?yún)?shù)列表 |
varargout |
可變長(zhǎng)輸出參數(shù)列表 |
MATLAB不提供其他高級(jí)語(yǔ)言的指定默認(rèn)參數(shù)值以及函數(shù)重載等語(yǔ)法,但靈活使用上述內(nèi)置的函數(shù)參數(shù),可以在一定程度上實(shí)現(xiàn)指定默認(rèn)參數(shù)值以及方法重載:
function [volume]=pillar(Do,Di,height)
if nargin==2,
height=1;
end
volume=abs(Do.^2-Di.^2).*height*pi/4;
MATLAB函數(shù)定義示例1
下面程序用來(lái)計(jì)算自由落體運(yùn)動(dòng)中位移量:
x = x 0 + v 0 t + 1 2 g t 2 x = x_0 + v_0 t + \frac{1}{2} g t^2 x=x0?+v0?t+21?gt2
function x = freebody(x0,v0,t)
% calculation of free falling
% x0: initial displacement in m
% v0: initial velocity in m/sec
% t: the elapsed time in sec
% x: the depth of falling in m
x = x0 + v0.*t + 1/2*9.8*t.*t;
該函數(shù)演示了一個(gè)MATLAB編程技巧: 計(jì)算乘法時(shí)應(yīng)盡量使用.*而非*,因?yàn)榍罢卟粌H對(duì)參數(shù)t為標(biāo)量的情況可用,也對(duì)變量t為向量或矩陣的情況可用.
freebody(0, 0, 2) % 得到 19.6000
freebody(0, 0, [0 1 2 3]) % 得到 [0 4.9000 19.6000 44.1000]
freebody(0, 0, [0 1; 2 3]) % 得到 [0 4.9000; 19.6000 44.1000]
MATLAB函數(shù)定義示例2
下面函數(shù)實(shí)現(xiàn)了從華氏溫度到攝氏溫度的轉(zhuǎn)換,該函數(shù)可以識(shí)別輸入的待轉(zhuǎn)換樣例的個(gè)數(shù),當(dāng)輸入的待轉(zhuǎn)換樣例個(gè)數(shù)為0時(shí),退出函數(shù).
function F2C()
while 1
F_degree = input('tempreature in Fahrenheit: ', 's');
F_degree = str2num(F_degree);
if isempty(F_degree)
return
end
C_degree = (F_degree-32)*5/9;
disp(['tempreature in Celsius: ' num2str(C_degree)])
end
(需要按Ctrl+C退出程序)
以函數(shù)句柄形式定義函數(shù)
我們也可以使用函數(shù)句柄的形式定義函數(shù),這更接近數(shù)學(xué)上的函數(shù)定義,其語(yǔ)法如下:
函數(shù)句柄 = @(輸入變量) 輸出變量
可以直接通過(guò)函數(shù)句柄調(diào)用該方法.
f = @(x) exp(-2*x);
x = 0:0.1:2;
plot(x, f(x));
pdf版本筆記的下載地址: MATLAB02_結(jié)構(gòu)化編程和函數(shù)定義(訪問(wèn)密碼:3834)
總結(jié)
以上是生活随笔為你收集整理的MATLAB02:结构化编程和函数定义「建议收藏」的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: gdoo耳机是国产品牌吗
- 下一篇: 显卡的位置在哪里