matlab程序設計基礎
- 程序設計
- 函數文件
- 1.函數文件的基本結構
- 2.創建并使用函數文件的示例
- 3.帶多個輸出的函數示例
- 4.包含子函數的函數文件
- 流程控制
- 1. `if` 條件語句
- 2. `switch` 多分支選擇語句
- 3. `try-catch` 異常處理語句
- ME與lasterr
- 4. `while` 循環語句
- 5. `for` 循環語句
- break和continue
程序設計
函數文件
在 MATLAB 中,函數文件(Function File) 是用于定義自定義函數的基本方式,擴展名為 .m
。它可以接收輸入參數,執行一系列操作并返回結果。
1.函數文件的基本結構
函數文件以 function
開頭,其基本結構如下:
function [輸出1, 輸出2, ...] = 函數名(輸入1, 輸入2, ...)% 函數說明% 執行語句
end
- 文件名必須和函數名一致,例如函數叫
myadd
,文件名必須是myadd.m
。 - 可定義多個輸入和多個輸出。
- 一個函數文件只能有一個主函數,可以包含多個子函數。
2.創建并使用函數文件的示例
定義一個加法函數 myadd.m
。
function result = myadd(a, b)% myadd: 返回 a + b 的結果% 輸入檢查if nargin ~= 2error('需要兩個輸入參數');endif ~isnumeric(a) || ~isnumeric(b)error('輸入參數必須是數值類型');endresult = a + b;
end
調用方法:
>> r = myadd(3, 5)
r =8
需要注意函數文件必須在當前工作路徑中,否則索引不到。
3.帶多個輸出的函數示例
定義一個計算平均值與標準差的函數 mystat.m
。
function [avg, s] = mystat(x)% mystat: 返回平均值和標準差if nargin ~= 1error('需要一個輸入向量');endif ~isvector(x) || ~isnumeric(x)error('輸入必須是數值向量');endn = length(x);avg = sum(x) / n;s = sqrt(sum((x - avg).^2) / (n - 1));
end
調用方法:
>> [mean_val, std_val] = mystat([1 2 3 4 5])
mean_val =3
std_val =1.5811
4.包含子函數的函數文件
一個函數文件中可以包含多個函數,但只有**第一個函數(主函數)**是對外可見的,其他的是子函數,僅供主函數調用。
function y = mainfunc(x)y = helperfunc(x) + 1;
endfunction z = helperfunc(x)z = x^2;
end
流程控制
1. if
條件語句
用于執行滿足條件的代碼塊。
語法:
if 條件1% 條件1為真時執行的語句
elseif 條件2% 條件2為真時執行的語句
else% 所有條件不滿足時執行
end
示例:
x = 5;
if x > 10disp('x 大于 10');
elseif x == 5disp('x 等于 5');
elsedisp('x 小于或等于 10 且不等于 5');
end
x 等于 5
2. switch
多分支選擇語句
根據變量的值選擇執行哪個代碼塊,適用于多個固定值的判斷。
語法:
switch 變量case 值1% 變量等于值1時執行case 值2% 變量等于值2時執行otherwise% 所有情況都不匹配時執行
end
示例:
day = 'Monday';
switch daycase 'Monday'disp('今天是星期一');case 'Tuesday'disp('今天是星期二');otherwisedisp('不是星期一也不是星期二');
end
今天是星期一
3. try-catch
異常處理語句
用于捕捉運行時錯誤,使程序即使遇到異常也不會中斷運行。
語法:
try% 嘗試執行的代碼
catch 異常變量% 出錯時執行的代碼
end
示例:
>> tryresult = 10 / acatch MEdisp('發生錯誤:');disp(ME);end
發生錯誤:MException - 屬性:identifier: 'MATLAB:UndefinedFunction'message: '函數或變量 'a' 無法識別。'cause: {}stack: [0x1 struct]Correction: []>>
ME與lasterr
在早期 MATLAB 版本中,catch 子句不接變量名,錯誤信息由內置變量 lasterr 存儲。示例如下:
>> tryresult = 10 / a;
catchdisp('出錯:');disp(lasterr); % 顯示最后一條錯誤信息
end
出錯:
函數或變量 'a' 無法識別。
lasterr 是一個全局變量,保存最后發生的錯誤信息。
在新版本 MATLAB 中(R2010+),推薦使用結構化異常對象 MException 處理錯誤。catch 后可以接一個變量(如 ME),此變量就是一個 MException 對象。
tryresult = 10 / 0;
catch MEdisp('發生錯誤:');disp(ME.message); % 錯誤消息字符串disp(ME.identifier); % 錯誤標識符(如'MATLAB:divideByZero')disp(ME.stack(1)); % 錯誤發生的位置(文件、行號、函數)
end
MException 對象詳解:
當錯誤發生時,MATLAB 會創建一個 MException 類型的對象,常用屬性如下:
屬性名 | 說明 |
---|---|
ME.message | 錯誤的文本描述 |
ME.identifier | 錯誤的唯一標識符 |
ME.stack | 一個結構數組,描述錯誤發生的函數、文件和行號 |
ME.cause | 若是嵌套異常或 rethrow,可追蹤根本原因 |
4. while
循環語句
當條件為真時反復執行某段代碼。
語法:
while 條件% 循環體
end
示例:
i = 1;
while i <= 5disp(['當前 i = ', num2str(i)]);i = i + 1;
end
當前 i = 1
當前 i = 2
當前 i = 3
當前 i = 4
當前 i = 5
5. for
循環語句
用于對已知范圍的變量進行迭代。
語法:
for 變量 = 向量或數組% 循環體
end
示例:
for i = 1:5disp(['i = ', num2str(i)]);
end
i = 1
i = 2
i = 3
i = 4
i = 5
break和continue
控制語句 | 說明 |
---|---|
break | 終止當前循環 |
continue | 跳過當前循環的剩余部分,直接進入下一輪 |
示例:
for i = 1:10if mod(i, 2) == 0continue; % 跳過偶數endif i > 7break; % 超過 7 時跳出循環enddisp(i);
end1357