1. 程式人生 > >MATLAB入門學習-#5-M檔案(MATLAB)程式基礎

MATLAB入門學習-#5-M檔案(MATLAB)程式基礎

MATLAB入門學習-#5-M檔案(MATLAB)程式基礎

正式開始之前,先來兩個學習中學到的小TIP:
1.matlab程式中,中括號內容一般都是可以省略的東西。
2.註釋快捷鍵Ctrl+2,取消註釋快捷鍵Ctrl+T

1.was ist M檔案…

M檔案就是MATLAB裡的程式檔案,然後呢可以分成指令碼檔案Script File(也叫命令檔案)和程式檔案Function File這兩種。

  • 區別

1.命令檔案沒有輸入,沒有返回;
2.命令檔案可以對工作空間的變數操作,結果返回工作空間,而函式檔案中的變數為區域性變數,函式執行完畢,變數被清除;
3.命令檔案可以直接執行,函式檔案見需要呼叫的形式執行(除了特殊的函式檔案之外)。

2.程式控制結構

  • 資料輸入input:

This MATLAB function displays the prompt string(提示語) on the screen, waits for input
from the keyboard, evaluates any expressions in the input, and returns the
result.

result = input(prompt)
str = input(prompt,'s')
  • 資料顯示disp:(除此之外還有fprintf和sprintf)

disp這個命令用起來還是挺有意思的,但是基本上要輸出的東西里既有確定的字串又有不確定的變數,那還是把它們的資料型別都轉成str,然後用例如**disp([‘str1’,‘str2’,num2str(a)])**這樣的來進行輸出。
下面是我使用時候的一些發現:

>> a=1996;
>> disp a      %這樣不帶括號的話就是輸出a這個str
a
>> disp(a)     %帶括號就是輸出變數a的內容,這個不限是數值型還是str
        1996

>> disp('hello')
hello
>> disp('hello',a)
錯誤使用 disp
輸入引數太多。
 
>> disp(['hello',a])
helloߌ
>> disp(['hello'],a)
錯誤使用 disp
輸入引數太多。
 
>> disp(['hello',num2str(a)])    %實際上把這種和下面那種記住就OK
hello1996
>> name=chang;
未定義函式或變數 'chang'。
 
>> name='chang';
>> disp(['hello ',name])
hello chang
  • 程式暫停pause
  • 分支結構

pls use IF or SWITCH or TRY

  • 迴圈結構

pls use WHILE or FOR

迴圈可以巢狀,但是在MATLAB中,迴圈的執行效率很低(為什麼?)因此應該儘量避免使用迴圈,更要避免使用兩重以上的迴圈(根據自己的使用經驗,三重迴圈執行起來就已經非常慢了!)
怎樣避免使用迴圈和提高迴圈效率?
有些可以通過MATLAB的向量化語言,通過矩陣或者向量操作完成;
有些可以通過MATLAB提供的一些特殊操作工具箱函式完成;
預分配的使用,會大大增加迴圈效率;

% 單分支條件
A = input('input A');
if A > 10
    disp(A);
end

% 雙分支if語句
x = input('x');
if x > 10
    y = log(x);
else
    y = cos(x);
end

% 多分支if語句
c = input('input a character', 's');
if c >= 'A' & c <= 'Z'
    disp(char(abs(c) + abs('a') - abs('A')));
    %abs(X)是求絕對值的,同時也能實現str到ASCII的轉換
    %abs(X)=sqrt(real(X).^2+imag(X).^2)
    %char能把ASCII碼轉回str,是一個和abs對應的命令
elseif c >= 'a' & c <= 'z'
    disp(char(abs(c) - abs('a') + abs('A')));
elseif c >= '0' & c <= '9'
    disp(c);
end

% switch分支
price = input('input price');
switch fix(price/100)    %fix是個四捨五入的命令
    case {0, 1}
        rate = 0;
    case {2, 3, 4}
        rate = 0.03;
    case {5, 6, 7, 8, 9}
        rate = 0.05;
    otherwise
        rate = 0.1;
end

% for迴圈
A = 1:100;
sumA = 0;
for k = 1:100
    sumA = sumA + A(k);
end

% while迴圈
while 1
    c = input('input a character', 's');
    if isempty(abs(c))     %isempty - 確定陣列是否為空,是空的返回1.
        break;
    end
end

3.函式檔案!

在這裡插入圖片描述

此部分需要注意的是函式的基本結構和解決未知個數輸入和未知個數輸出的nargin,nargout,varargin,varargout,nargchk這幾個命令。
其實不難理解,用下面這一個程式碼例項就可以解決了:

function re = add_var(a, b, varargin) 
%varargin代表不知道有幾個的變數輸入
% 這個例項裡面,varargin前面還有a和b
% 所以它的nargin其實等於2+varargin的個數
% (這個部分會 顯示在help add_var裡面)

error(nargchk(2, 4, nargin));
%nargcheck(min,max,num)就是看num在不在min和max之間
%判斷完若是不在範圍內會有資訊告知輸出,在範圍內的話就輸出一個空矩陣
%error([])就什麼都不會發生
%error('str')則會報錯,同時顯示str
if nargin == 2
    re = a + b;
elseif nargin == 3
    c = varargin{1};
    re = a + b + c;
elseif nargin == 4
    c = varargin{1};
    d = varargin{2};
    re = a + b + c + d;
else
    error('wrong');
end