Matlab M檔案 方煒 台大生機系.

Slides:



Advertisements
Similar presentations
实验安排 本周六和下周六上机时间: 上午: 8 : 30~10 : 00 第一组 上午: 11 : 00~11 : 30 第二组 下午: 14 : 30~16 : 00 第三组.
Advertisements

第 5 章 中國的都市.
第六讲 MATLAB 语言程序设计 6.1 MATLAB语言的函数的基本结构 6.2 全局、局部变量、子函数与私有目录
南山中學 102學年度 性別平等教育週性別教育 性騷擾防治.
營利事業所得稅查核準則 相關概念介紹 南區國稅局 新營分局 林俊標 各位學員大家好:
第 2 章 初探 C++.
第四章 MATLAB编程基础 4.1 概述 4.2 流程控制 4.3 脚本文件 4.4 函数文件 4.5 M文件调试 4.6 M文件性能分析
第7章 C#函數與.NET Framework類別函數庫
TQC+ 物件導向程式認證-JAVA.
學 號:997I0010、997I0024 組 員:洪韋鈴、王婷婷 日 期: 指導老師:王立杰 老師
古文閱讀 – 像虎伏獸 明 劉基 組員: 5號江依倫 6號江若薇 12號張珉芫 32號蔡燕如.
南投縣永昌國小 自衛消防編組訓練.
中鸣虚拟搜救比赛项目 (一人) 现场主题创作(40%)(一人) 3D虚拟搜救(60%)(一人).
Introduction to Matlab
Matlab教學 Speaker:林昱志 Date:2012/10/18.
1-1 MATLAB 小傳(1) 由MathWorks公司於1984年推出的 數學軟體。 名稱是由「矩陣實驗室﹙MATrix
1012 MATLAB 教學 彭奕翔 2013/02/27.
第6章 字符串、数组、簇和矩阵.
第6章 字符串、数组、簇和矩阵.
認識拿破崙˙波拿巴 關於一位運氣很差的矮子的趣事兩三件 我不是矮子!! 本日主角 重點不是這個吧? 惡搞人員:橘蘋3顆和一隻小精靈.
程設一.
性別透視鏡 鳳鳴電台 高宜君老師.
公司法(六) 股份有限公司 1.
第四章 地理資訊與地理資訊系統.
FC OB1 FB SFC 操作系统 SFB OBs 结构化编程 其它
第七讲 matlab的程序设计 —— matlab语言称为第四代编程语言,程序简洁、可读性很强而且调试十分容易。
Matlab及其应用 鲍文 哈尔滨工业大学 先进动力控制与可靠性研究所
課程名稱:程式設計 授課老師:________
Chapter 1 用VC++撰寫程式 Text book: Ivor Horton.
MATLAB介紹.
第五讲 数据的分组、合并与转换.
簡易 Visual Studio 2010 C++ 使用手冊
结构化编程 FC OB1 FB SFC 操作系统 SFB OBs 其它
實作輔導 日期: 3/11 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
1 巨集 2 資料型態 3 物件、屬性、方法與事件 4 陳述式與副函式 5 其他注意事項 6 範例
Z Mathematical Model ‡ ' MATLAB简介.
Function.
張智星 清大資工系 多媒體檢索實驗室 第九章: 矩陣的處理與運算 張智星 清大資工系 多媒體檢索實驗室.
引 言.
簡易 Visual Studio 2005 C++ 使用手冊
第九章: 矩陣的處理與運算 張智星 (Roger Jang)
第六章 安全衛生工作守則 6-1 前 言  6-2 訂定依據相關法令規定  6-3 工作守則製作程序及製作前應注意事項  6-4 如何訂定適合需要之安全衛生工作守則  6-5 結 論.
第1章 MATLAB操作基础 1.1 绪论 1.2 MATLAB概述 1.3 MATLAB的运行环境与安装 1.4 MATLAB集成环境 1.5 MATLAB帮助系统.
MATLAB 程式設計入門篇 初探MATLAB
MATLAB 程序设计语言 任课教师:刘毅 西安电子科技大学 ISN国家重点实验室.
MATLAB介绍 Matlab基本命令介绍 Matlab矩阵运算 Matlab控制流 Matlab图像处理工具箱 实习题讲解.
第2章 MATLAB程序设计 编者.
實作輔導 2 日期: 3/24(星期六) 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
第9章 MATLAB环境下的仿真软件Simulink
Speaker: Liu Yu-Jiun Date: 2009/4/29
張智星 (Roger Jang) 清大資工系 多媒體檢索實驗室
MATLAB 程式設計入門篇 初探MATLAB
學這些有什麼好處呢? 為了把資料作更客觀之總結描述或比較多組資料。總而言之,就是要找出一個數能代表整組數據。
MATLAB 程式設計入門篇 初探MATLAB
撰寫MATLAB基礎財務程式 柯婷瑱.
第二章 MATLAB编程与作图 2.1 程序设计 2.2 作图 2.3 在线帮助和文件管理 2.4 习题 2019年4月23日
VC++程序调试演示 An Overview of ICU 19th International Unicode Conference
Ch07. 函式.
Introduction to Matlab
第1章 MATLAB操作基础 1. 1 MATLAB概述 1. 2 MATLAB的运行环境与安装 1. 3 MATLAB集成环境 1
MATLAB 程式設計 程式除錯 方煒 台大生機系.
MATLAB 实用教程.
Arguments to the main Function and Final Project
第6章 字符串、数组、簇和矩阵.
第二单元 第3课 Matlab命令执行方式 1.Matlab命令执行方式 2.程序调试.
Usage Eclipse 敏捷方法工具介紹 實驗室網站:
数学是知识的工具,亦是其它知识工具的泉源。 ——勒内·笛卡尔
Introduction to the C Programming Language
MATLAB 程式設計入門篇 程式除錯 張智星 (Roger Jang)
Gaussian Process Ruohua Shi Meeting
Presentation transcript:

Matlab M檔案 方煒 台大生機系

Matlab 底稿(Script) 副檔名為m的檔案 包含 MATLAB各種指令 在MATLAB指令視窗直接輸入檔名,即逐一執行檔案內的指令

M檔案的顯示 在目前目錄下有一個M檔案“script01.m”,可用 type 指令顯示其內容: Matlab M檔案的顯示 在目前目錄下有一個M檔案“script01.m”,可用 type 指令顯示其內容: >> type script01.m   clear all % 清除所有變數 x = [1 4 -2 3 -1 -5]; for i = 1:length(x), if x(i)>0, fprintf('x(%g) = %g is positive\n', i, x(i)); else fprintf('x(%g) = %g is negative or zero\n', i, x(i)); end

M檔案的執行 欲執行 script01.m, 在指令視窗下輸入 script01 即可 >> script01 Matlab M檔案的執行 欲執行 script01.m, 在指令視窗下輸入 script01 即可 >> script01 x(1) = 1 is positive x(2) = 4 is positive x(3) = -2 is negative or zero x(4) = 3 is positive x(5) = -1 is negative or zero x(6) = -5 is negative or zero

M檔案的執行效應 執行程式底稿,相當於直接在指令視窗下下達 script01.m 裡的每一列指令 Matlab M檔案的執行效應 執行程式底稿,相當於直接在指令視窗下下達 script01.m 裡的每一列指令 所產生的變數也都存放在 MATLAB 的基本工作空間(Base Workspace),可驗證如下: >> whos Name Size Bytes Class   i 1x1 8 double array x 1x6 48 double array Grand total is 7 elements using 56 bytes

Matlab 提示 可在函數中呼叫一程式底稿 產生的變數會放在該函數的工作空間中

底稿的優缺點 優點 缺點 適用於簡單但重複性高的程式碼 產生的變數保留在基本工作空間中 Matlab 底稿的優缺點 優點 適用於簡單但重複性高的程式碼 產生的變數保留在基本工作空間中 變數檢視及除錯容易 缺點 不支援輸入及輸出引數(Input/Output Arguments) 變數互相覆蓋而造成程式錯誤

Matlab M 檔案編輯器 (I) M 檔案是文字檔 可以用各種文字編輯器修改 儲存時,需以文字模式儲存 MATLAB在 Windows 及 Mac 平台上,提供了內建的「M 檔案編輯器」(M-File Editor) 點選指令視窗的 file/open 下拉式選單,開啟 M 檔案編輯器 或在指令視窗直接鍵入「edit filename.m」或「open filename.m」

M 檔案編輯器 (II) 開啟 Script01.m,可輸入 即可開啟 M 檔案編輯器: >> edit script01.m Matlab M 檔案編輯器 (II) 開啟 Script01.m,可輸入 >> edit script01.m 即可開啟 M 檔案編輯器:

Matlab 提示 M 檔案編輯器以不同的顏色顯示註解、關鍵字、字串、及一般程式碼 M 檔案編輯器也是一個除錯器(Debugger)

函數 (function) 函數 也是 M 檔案的一種 可接受輸入變數,並將結果送至輸出變數 運算過程產生的變數都存放在函數本身的工作空間 Matlab 函數 (function) 函數 也是 M 檔案的一種 可接受輸入變數,並將結果送至輸出變數 運算過程產生的變數都存放在函數本身的工作空間 不會和 MATLAB 基本工作空間的變數相互覆蓋 函數適用於大型程式碼 使程式碼模組化(Modularized)並易於維護與改進

函數顯示及內容 func1.m 可算出一向量的平均值 用 type 指令顯示其內容: Matlab 函數顯示及內容 func1.m 可算出一向量的平均值 用 type 指令顯示其內容: >> type func1.m function average = func1(vector) average = sum(vector)/length(vector); % 計算平均值 第一列為函數定義列(Function Definition Line) 定義函數名稱(func1,最好和檔案的檔名相同) 輸入引數(vector) 輸出引數(average) function為關鍵字 第二列為函數主體(Function Body) 規範函數運算過程,並指定輸出引數的值

呼叫函數 呼叫此函數,可輸入: >> vec = [1 5 3]; >> ave = func1(vec) Matlab 呼叫函數 呼叫此函數,可輸入: >> vec = [1 5 3]; >> ave = func1(vec) ave = 3

函數線上輔助說明 (I) 加上函數「線上輔助說明」(On-line Help) 在函數定義列下直接加入註解 Matlab 函數線上輔助說明 (I) 加上函數「線上輔助說明」(On-line Help) 在函數定義列下直接加入註解 >> type func2.m function average = func(vector) % FUNC2 A simple function with a single help line. % % Usage of this function: % output = func2(input) % "output" is the average of the input vector "input".   average = sum(vector)/length(vector); % 計算平均值

函數線上輔助說明 (II) 函數定義列之後的連續註解(以「%」開頭),即為函數的線上輔助說明 Matlab 函數線上輔助說明 (II) 函數定義列之後的連續註解(以「%」開頭),即為函數的線上輔助說明 輸入「help 函數主檔名」,即可看到這些輔助說明 >> help func2 FUNC2 A simple function with a single help line. Usage of this function: output = func2(input) "output" is the average of the input vector "input".

H1輔助說明 函數線上輔助說明,最重要的就是第一列 使用lookfor keyword查詢 MATLAB 指令 又稱為「H1 輔助說明」(H1 Help) 使用lookfor keyword查詢 MATLAB 指令 對所給的關鍵字和搜尋路徑上所有函數的「H1 輔助說明」一一比對 >> lookfor 'help line' FUNC2 A simple function with a single help line.

Matlab 提示 安裝很多工具箱,或搜尋路徑很長時,lookfor指令的執行時間可能會較長

函數的目錄 (I) 使MATLAB 在任何目錄內,均可執行某目錄內的函數 將和某應用相關的函數,存放於一子目錄內 將此目錄加入搜尋路徑 加入路徑 => 使用 addpath 指令 移除路徑 => 使用 rmpath指令

函數的目錄 (II) 建立目錄的線上輔助說明 在此目錄下加入特定檔案 Contents.m 此檔案只能包含輔助說明文字 每列均需以「%」開頭 Matlab 函數的目錄 (II) 建立目錄的線上輔助說明 在此目錄下加入特定檔案 Contents.m 此檔案只能包含輔助說明文字 每列均需以「%」開頭 輸入「help 目錄名稱」時,顯示在「目錄名稱」下 Contents.m 的輔助說明

函數命名的限制 函數名稱和變數名稱有相同的限制 函數名稱和檔案名稱不同 Matlab 函數命名的限制 函數名稱和變數名稱有相同的限制 只接受前 31 個字母(MATLAB 5.x)或前 63 個字母(MATLAB 6.x 和 7.x) 以英文字母作為開頭 函數名稱和檔案名稱不同 仍可依檔案名稱呼叫檔案 函數名稱將被忽略

函數的輸入和輸出 一個函數可以有多輸入及輸出 func3.m 可接受兩個輸入並產生兩個輸出 func3.m 的呼叫方式 Matlab 函數的輸入和輸出 一個函數可以有多輸入及輸出 func3.m 可接受兩個輸入並產生兩個輸出 >> type func3.m function [ave1, ave2] = func3(vector1, vector2); ave1 = sum(vector1)/length(vector1); ave2 = sum(vector2)/length(vector2); func3.m 的呼叫方式 >> [a, b] = func3([1 2 3], [4 5 6 7 8]) a = 2 b = 6

Examples of Function Definition Lines One input, one output: function [area_square] = square(side) 2. Brackets are optional for one input, one output: function area_square = square(side) 3. Two inputs, one output: function [volume_box] = box(height,width,length) 4. One input, two outputs: function [area_circle,circumf] = circle(radius) 5. No named output: function sqplot(side)

輸出入變數的個數 (I) 決定函數實際輸入輸出變數的個數 使用內建變數 nargin 及 nargout 主要功能 Matlab 輸出入變數的個數 (I) 決定函數實際輸入輸出變數的個數 使用內建變數 nargin 及 nargout 主要功能 設定未被指定之輸入引數的預設值 避免計算未被用到的輸出引數,以節省計算時間

輸出入變數的個數 (II) 上述函數 func3.m 可改寫成 func4.m >> type func4.m Matlab 輸出入變數的個數 (II) 上述函數 func3.m 可改寫成 func4.m >> type func4.m function [ave1, ave2] = func4(vector1, vector2)   if nargin == 1, % 只有一個輸入變數 ave1 = sum(vector1)/length(vector1); end if nargout == 2, % 有兩個輸出變數 ave2 = sum(vector2)/length(vector2);

輸出入變數的個數 (III) func4.m 可以接受一個或兩個輸入變數: MATLAB 函數亦可傳送不定數目的輸入引數和輸出引數 >> [a, b] = func4([1 2 3], [4 5 6 7 8]) a = 2 b = 6 >> c = func4([1 3 5 7 9]) c = 5 MATLAB 函數亦可傳送不定數目的輸入引數和輸出引數

提示 從外表來看,MATLAB 函數的變數傳遞方法是 “Call by Value” 實際運作上 函數的工作空間中,所有的輸入變數均是父工作空間(Parent Workspace)的一份拷貝 在函數中更改這些輸入變數,並不會影響原先父工作空間的變數 實際運作上 若輸入變數未被修改,MATLAB 採用“Call by Reference” 否則,則採用“Call by Value”

次函數與私有化目錄 一個 M 檔案可以包含一個以上的函數 主函數與次函數的位置 一個主函數(Primary Function) Matlab 次函數與私有化目錄 一個 M 檔案可以包含一個以上的函數 一個主函數(Primary Function) 其他則為次函數(Subfunctions) 次函數只能被同檔案中的函數(主函數或次函數)呼叫,但不可被不同檔案的其他函數呼叫 主函數與次函數的位置 主函數必需出現在最上方 其後接上任意數目的次函數 次函數的次序並無任何限制

主函數與次函數

mystats.m function [avg,med]=mystats(u) n=length(u); avg=mean(u,n); med=median(u,n); function a=mean(v,n) a=sum(v)/n; function m=median(v,n) w=sort(v); if rem(n,2)==1 m=w((n+1)/2); else m=(w(n/2)+w(n/2+1))/2; end

主函數與次函數 func5.m 包含一個主函數及一個次函數 呼叫此函數 >> type func5.m Matlab 主函數與次函數 func5.m 包含一個主函數及一個次函數 >> type func5.m function out = func5(x) recip = reciproc(x); out = sum(recip); % Definition for subfunctions function output = reciproc(input) %計算倒數向量 output = 1./input; 呼叫此函數 >> func5([1 2 3]) ans = 1.8333

函數呼叫 1. As a character string identifying the appropriate function M-file, which is function y = fun1(x) y = x.^2-4; The function may be called as follows, to compute the zero over the range 0 £ x £ 3: >>[x, value] = fzero(’fun1’,[0, 3]) 第2名 (continued …)

函數呼叫 第1名 2. As a function handle to an existing function M-file: >>[x, value] = fzero(@fun1,[0, 3]) 3. As an “inline” function object: >>fun1 = ’x.^2-4’; >>fun_inline = inline(fun1); >>[x, value] = fzero(fun_inline,[0, 3]) (continued …)

函數呼叫 4. As a string expression: >>fun1 = ’x.^2-4’; >>[x, value] = fzero(fun1,[0, 3]) or as >>[x, value] = fzero(’x.^2-4’,[0, 3])

巢狀函數

Test_nested_1.m function res=test_nested_1 a=1;b=2;x=0;y=9; fprintf(‘Before call to fun1\n’); fprintf(‘a,b,x,y=%2d %2d %2d %2d \n’,a,b,x,y); x=fun1(x); fprintf(‘\nAfter call to fun1\n’); function res=fun1(y) fprintf(‘\nAt start of call to fun1\n’); y=y+5;a=a+1;res=y; fprintf(‘\nAt end of call to fun1\n’); end

Results of Test_nested_1 Before call to fun1 a,b,x,y= 1 2 0 9 At start of call to fun1 a,b,x,y= 1 2 0 0 At end of call to fun1 a,b,x,y= 2 2 0 5 After call to fun1 a,b,x,y= 2 2 5 9 >>

Test_nested_2.m function res=test_nested_1 a=1;b=2;x=0;y=9; fprintf(‘Before call to fun1\n’); fprintf(‘a,b,x,y=%2d %2d %2d %2d \n’,a,b,x,y); x=fun1(x); fprintf(‘\nAfter call to fun1\n’); end function res=fun1(y) fprintf(‘\nAt start of call to fun1\n’); y=y+5;a=a+1;res=y; fprintf(‘\nAt end of call to fun1\n’);

Results of Test_nested_2 Before call to fun1 a,b,x,y= 1 2 0 9 At start of call to fun1 ??? Undefined function or variable "a". Error in ==> test_nested_2>fun1 at 11 fprintf('a,b,x,y=%2d %2d %2d %2d \n',a,b,x,y); Error in ==> test_nested_2 at 5 x=fun1(x);

Test_nested_3.m function res=test_nested_3 global a b x y fprintf('Before call to fun1\n'); fprintf('a,b,x,y=%2d %2d %2d %2d \n',a,b,x,y); x=fun1(x); fprintf('\nAfter call to fun1\n'); end function res=fun1(y) fprintf('\nAt start of call to fun1\n'); y=y+5;a=a+1;res=y; fprintf('\nAt end of call to fun1\n');

Results of Test_nested_3 Before call to fun1 a,b,x,y= 1 2 0 9 Warning: The value of local variables may have been changed to match the globals. Future versions of MATLAB will require that you declare a variable to be global before you use that variable. > In test_nested_3>fun1 at 11 In test_nested_3 at 6 At start of call to fun1 At end of call to fun1 a,b,x,y= 2 2 0 14 After call to fun1 a,b,x,y= 2 2 14 14 >>

私有化目錄 私有化目錄(Private Directory) 在目錄中建立名稱為 private 的私有化目錄 存放與這目錄相關的函數 Matlab 私有化目錄 私有化目錄(Private Directory) 在目錄中建立名稱為 private 的私有化目錄 存放與這目錄相關的函數 目錄 private 之下的函數,只能被其父目錄函數所呼叫,不能被其他目錄的函數來呼叫

函數搜尋次序 從 M 檔案呼叫一個函數時,MATLAB 搜尋函數的次序: MATLAB 找到第一個檔名相符的函數,即會立即取用 檢查此函數是否為次函數 檢查此函數是否為私有化目錄的函數 從系統所設定的搜尋路徑找尋此函數 MATLAB 找到第一個檔名相符的函數,即會立即取用

區域變數與全域變數 區域變數(Local Variables) 每一個函數在運算時,均佔用個別的記憶體 Matlab 區域變數與全域變數 區域變數(Local Variables) 每一個函數在運算時,均佔用個別的記憶體 此工作空間和 MATLAB 的基本工作空間或是其他函數的工作空間是互相獨立的 不同空間的變數是完全獨立,不會相互影響 不同工作空間的變數,稱為「區域變數」(Local Variables)

全域變數的使用 (I) 減少變數的傳遞,可用「全域變數」(Global Variables) 使用全域變數前,需先進行變數宣告 Matlab 全域變數的使用 (I) 減少變數的傳遞,可用「全域變數」(Global Variables) 使用全域變數前,需先進行變數宣告 >> type func6.m function func6 global X % 全域變數宣告 X = X + 2; fprintf('The value of X in "func6" is %g.\n', X);

全域變數的使用 (II) Func6.m沒有輸出和輸入,只宣告全域變數 X,將 X 的值加 2,並印出其值 測試 Matlab 全域變數的使用 (II) Func6.m沒有輸出和輸入,只宣告全域變數 X,將 X 的值加 2,並印出其值 測試 >> global X % 在基本工作空間進行全域變數 x 的宣告 >> X = 2; >> fprintf('The value of X in the base workspace is %g.\n', X); The value of X in the base workspace is 2.   >> func6; The value of X in "func6" is 4. The value of X in the base workspace is 4.

全域變數的使用原則 盡量少用全域變數 使用全域變數,請遵循下列兩原則 檢視工作空間的變數,輸入whos global Matlab 全域變數的使用原則 盡量少用全域變數 全域變數使程式的流程不透明,造成程式除錯或維護的困難 使用全域變數,請遵循下列兩原則 使用前一定要宣告 使用全部大寫或較長的變數名稱,以資區別 檢視工作空間的變數,輸入whos global 清除所有工作空間的全域變數 X,需使用 clear global X

程式碼保護:p-code p-code 一般的 M 檔案都是文字檔 所有的 MATLAB 原始程式碼都看得到 讓別人使用您的程式碼,又不想被看到程式碼的內容,使用 pcode 指令將底稿或函數轉成 p-code(即Pseudo-Code) pcode filename.m

p-code的使用 將函數 func5.m 轉成 p-code 檢視func5,以p-code的程式碼為優先 Matlab p-code的使用 將函數 func5.m 轉成 p-code >> pcode func5.m >> dir *.p func5.p 檢視func5,以p-code的程式碼為優先 >> which func5 D:\matlabBook\MATLAB程式設計:入門篇\15-M檔案\func5.p 呼叫 p-code 的函數和一般函數並無不同 >> func5([2 4 8]) ans = 0.8750

p-code提高效率 一函數被呼叫時,MATLAB 會載入並剖析(Parse)此函數 pcode 的作用是將程式碼剖析後的結果儲存 剖析結果存放置在記憶體內 下次再呼叫此函數,可以省下剖析所花的時間 pcode 的作用是將程式碼剖析後的結果儲存 程式碼牽涉到很多 M 檔案時 將程式碼轉成 p-code,節省剖析的時間