Matlab 編程入門(一):編程基礎

来源:https://www.cnblogs.com/Endlessp162096/archive/2018/04/15/8849802.html
-Advertisement-
Play Games

上學期學了一些matlab的知識,這學期再用時竟然發現已經忘得差不多了(┬_┬) 於是決定重新開始並將它們記錄下來,也方便自己以後查漏補缺! M文件編程 腳本文件 matlab有自己的命令行視窗,對於簡單的命令,可以直接在命令行視窗輸入,但隨著命令行的增加或者命令本身複雜度的增加,再使用命令行就顯得 ...


 

上學期學了一些matlab的知識,這學期再用時竟然發現已經忘得差不多了(┬_┬)

於是決定重新開始並將它們記錄下來,也方便自己以後查漏補缺!

 

M文件編程

  • 腳本文件

    matlab有自己的命令行視窗,對於簡單的命令,可以直接在命令行視窗輸入,但隨著命令行的增加或者命令本身複雜度的增加,再使用命令行就顯得有些不便了,這時就需要腳本文件了。可以說,腳本文件是matlab指令集合的封裝。

  • 函數文件  

    函數文件以function開始,end結束,這也是區別於腳本文件的地方。

     在function後面接著定義輸出參數,函數名和輸入參數,比如:          

             function [x,y,z] = math_count(a,b,c)    

    x,y,z是輸出參數,以方框括起來,math_count是函數名,a,b,c是輸入參數,以圓括弧括起來。

     也可以沒有參數,比如:      

           function printresults(x,y)    

    printresults是函數名,x和y是輸入參數,沒有輸出參數。

  • 數據類型 

    matlab共有6中基本數據類型,分別是數值類型、邏輯類型、字元串、函數句柄、結構體和單元數組。這裡我們簡單地介紹前四種。

  1. 數值類型           

     基本的數值類型包括整數類型和浮點數類型,額外的數值類型還有複數類型、無窮量(Inf)和非數值量(NaN),後面的兩種算是matlab的特色類型,當然要記錄一下啦!

    • 複數類型

      複數包括實部和虛部兩部分,matlab中預設使用i和j作為複數的虛部標誌。創建複數時,可以直接利用複數形式進行輸入或使用函數complex。         

       z=1+2i  %利用複數形式進行輸入    

      輸出結果:  

                            

       z=complex(2,3)  %利用complex(x,y)函數進行輸入       

      輸出結果:

                                   

       z=complex(2%利用complex(x),如果x是實數,z=x+0i,如果x是複數,z=x

      輸出結果:

            

    • 無窮量(Inf)和非數值量(NaN)

      Matlab中使用Inf和-Inf分別代表正無窮量和負無窮量,NaN代表非數值量。

     正負無窮量通常由於運算溢出而產生的結果,而非數值量是由於0/0或Inf/Inf非正常運算產生的結果,並且這兩個NaN是不同的。

     Inf和NaN是Matlab中的特殊變數,除此之外,Matlab還有一些特殊的變數

    1. ans:系統預設的用作保存運算結果的變數名
    2. pi:圓周率
    3. eps:機器零閥值,Matlab中的最小數     

   2.邏輯類型

     Matlab把任何非0值當作為真,輸出為1,把零當作假,輸出為0.

     邏輯類型數據進行運算時需要用到關係操作符和邏輯運算符。

   對於Matlab的關係操作符,與c/c++基本相同,只有不等號有所不同,在c/c++中不等號為!=,而Matlab中不等號是~ =。

   Matlab中的邏輯操作符如下表所示:

Matlab邏輯運算符
邏輯運算符說明
&
|
~


  3.字元和字元串

  字元和字元串分別是字元數組和字元串數組中的文本。

  1. 字元數組是一個字元序列,如c='Hello Word!'
  2. 字元串數組是文本片段的容器,字元串數組提供一組用於將文本處理為數據的函數。從R2017a開始,字元串也可以使用雙引號創建,如str="You are best!"
  3. string函數

    R2016b以後,可以使用字元串數組string代替字元數組。官方文檔表明,還可以按照標準數組運算對字元串數組

    進行索引、重構和串聯,還可以使用 + 運算符向字元串追加文本。(一切都在向c++看齊啊)

 4.函數句柄

  函數句柄是一種間接調用函數的方式,相當於對一個函數取別名。

  例如:如果你有一個函數為myfunction,現在給定語句   

             f=@myfunction   %f是一個句柄,可以通過f調用myfunction  

     可以通過函數句柄構造匿名函數或指定回調函數,也可以函數句柄將一個函數傳遞給另一個函數,或者從主函數內部調用局部函數

    下麵給出通過函數句柄間接調用函數的例子:

    在命令行視窗輸入:     

           Handle=@sin;  %也可以自己建立函數,通過函數句柄間接調用
          >> x=0:pi/4:pi; %通過冒號創建一維數組,0是第一個數,每次以pi/4為單位遞增,pi是最後一個數
          >> y=Handle(x)

  輸出結果:

            

  有同學可能會問,直接調用不也是可以嗎,的確可以,但函數句柄有更多的優點,列舉幾個

  1.  提高運行速度。matlab對函數的調用每次都要搜索所有的路徑,使用函數句柄可以減少搜索,提高運行速度。
  2.  使用更方便。比如說,我在這個目錄運行後,創建了本目錄的一個函數句柄,當我轉到其他的目錄下的時候,創建的函數句柄還是可以直接調用的,而不需要把那個函數文件拷貝          過來。因為你創建的函數句柄中已經包含了路徑。
  • 控制流 

     Matlab的控制流也與c/c++大體相同,唯一要註意的是每個條件都有相應的end關鍵字。

    • 順序結構
    • 選擇結構
      • if—end
      • if—else—end
      • if—elseif—else—end  

     示例:

    新建腳本文件,保存為exe1_1    

            x=input('enter''x'':');%input函數返回你輸入的整數,提示信息用''括起來,如果想要輸出單引號,兩個單引號'' ''即可
            if(x>0)
              y=1;
            elseif(x==0)
                y=0;
            else y=-1;
            end        %不要忘記加end,Matlab不會自動補全end,最好一開始就寫下來,養成良好的編程習慣至關重要
            disp(y)     %disp作為輸出函數

  在命令行視窗調用exe1_1,輸入-5

  得到結果:

           

  • switch—case結構      

  示例:新建腳本文件,保存為ex1_2  

 1            month=3;
 2         switch month
 3               case {3,4,5}
 4                  season='spring'  %註意Matlab與c/c++語言的switch-case結構不一樣:只要條件滿足,立即返回,不對後面的語句做判斷,這也是為什麼不用加break的原因。
 5              case {6,7,8}
 6                  season='summer'
 7              case {9,10,11}
 8                  season='autumn'
 9              otherwise
10                  season='winter'
11            end

  得到結果:

       

  註意

  1.M文件的搜索路徑必須與當前路徑一致,否則運行會出錯,搜索路徑即保存M文件的位置。可以直接修改當前路徑與搜索路徑一致,也可以添加搜索路徑,這樣就一勞永逸了。  

                    

  2.如果遇到不認識的函數,可以利用help/doc命令在命令行查找,格式為help/doc function,function為函數名,養成查閱文檔的習慣很重要!         

  •  迴圈結構   
    • while,for語句
    • break、continue、return ——行尾可以不用加分號   

      每一個關鍵字後面都要有與之對應的end關鍵字

 範例:

    使用0.618法(黃金分割法)極小化f(t)=exp(-t)+exp(t),區間為[-1,1]。(即逼近函數在已知區間的極小值,找到對應的t)

    0.618法主要思想:

       0.618法在給定區間[a,b]內適當插入兩點a1,a2,並計算其函數值。

       a1,a2將區間分成三段,通過函數值大小的比較,刪去其中一段,使搜索區間得以縮小,

       然後再在保留下來的區間上作同樣的處理,如此迭代下去,從而得到極小點的數值近似解。

    0.618法主要步驟:

     1.在區間[a,b]內分別按照0.618和0.382的比例處取點a1 ,a2, 把[a,b]分為三段。 

     2.如果f(a1)>f(a2),令a=a1,a1=a2,a2=a+0.618*(b-a)   

    3.如果f(a1)<f(a2) ,令b=a2,a2=a1,a1=a+0.382*(b-a)

    4.如果滿足迭代條件或者超出給定迭代次數,程式終止,否則繼續運行下去。    

      新建名為fai.m的函數和zero_soe.m的函數

1                   function z= fai(t)
2               %  fai函數
3               %    給定函數
4               z=1*exp(-t)+1*exp(t);
5                end                             
 1              function [k] = zero_soe(a0,b0,iter,tol)
 2              %UNTITLED3 精確線性搜索之0.618法
 3              %   a0,b0分別代表左端點,右端點
 4              %   iter代表給定的迭代次數
 5              %   tol代表誤差限
 6             m=a0+0.382*(b0-a0);  %試探點lameda0
 7             n=a0+0.618*(b0-a0);  %試探點u0
 8             ym=fai(m);
 9             yn=fai(n);
10             count=0;    %現有的迭代次數
11             while(count<iter)
12                 if(ym>yn)
13                     if(b0-m<=tol)
14                         k=n;
15                         return;
16                     else
17                         a0=m;
18                         m=n;
19                         ym=yn;
20                         n=a0+0.618*(b0-a0);  
21                         yn=fai(n);
22                         count=count+1;
23                     end         
24                 else 
25                     if(n-a0<=tol)
26                         k=m;
27                       return;           
28                     else
29                        b0=n;
30                        n=m;
31                        yn=ym;
32                        m=a0+0.382*(b0-a0);
33                        ym=fai(m);
34                        count=count+1;
35                     end
36                 end
37             end
38             if(count>=iter)
39                disp('迭代次數超過給定次數!') ;
40             end
41             end

 得到結果:

      

 通過求導可知函數的極小值對應的t等於0,可知極小化的結果是正確的。

 (皆大歡喜[]~( ̄▽ ̄)~*)

 

常用的函數命令

  • 輸入命令  
  1. clc:清除命令行視窗
  2. clf :即clear figure,清楚圖形視窗
  3. clear:清除工作區的變數,clear all是清除全部變數
  4. format:設置命令行視窗顯示格式
  5. iskeyword:確認輸入是否為關鍵字,如果沒有輸入,則輸出全部的關鍵字
  6. who:顯示當前變數名列表
  7. whos:顯示變數詳細列表
  8. which:查看關鍵字的路徑  
  • 幫助          
  1.  help:命令行視窗中函數的幫助
  2.  doc:幫助瀏覽器中的參考頁
  3. demo:幫助瀏覽器中查看示例
  4. lookfor:在所有幫助條目中查看關鍵字

        

常用快捷鍵  

  • Ctrl+R :註釋(對多行有效)
  • Ctrl+T :取消註釋(對多行註釋有效) 
  • Ctrl+Z :取消上一次操作  
  • Ctrl+I     :自動縮進(對多行有效)
  • Ctrl+[     :減少縮進(對多行有效)
  • Ctrl+]     :增加縮進(對多行有效)  
  • ↑游標鍵 :選擇最近的一次命令  
  • Esc:清除當前行

 

 

參考資料:

  

還沒有寫完,以後慢慢補吧~

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 開發遵循原則之一: DRY原則:Don't Repeat Yourself(不要重覆你自己的代碼) 原因:重覆意味著維護成本的增大 方法的定義格式: [修飾符] 返回值類型 方法名稱 (形式參數1,形式參數){ 方法體 (如果方法需要給調用者返回一個結果,此時需要使用return 值) } 方法中的 ...
  • 一、基礎概念 靜態關鍵字 static 是成員修飾符,直接用於修飾成員。 (一)特點: 1.被靜態修飾的成果,可以直接被類名所調用。 2.靜態成員優先於對象存在。 3.靜態成員隨著類的載入而載入。隨著類的消失而消失。靜態成員的生命周期很長。 (二)註意事項: 1.靜態方法只能訪問靜態成員,不能訪問非 ...
  • 面向對象學習目錄 1 面向對象介紹 2 類、實例、屬性、方法詳解 3 面向過程與面向對象進一步比較 4 類與對象 5 屬性查找與綁定方法 6 小結 7 繼承與派生 8 組合 9 抽象類 10 多態 11 封裝 12 綁定方法與非綁定方法 13 內置方法(上) 14 內置方法(中)之描述符 15 內置 ...
  • 多態的作用 調用不同的子類將會產生不同的行為。 多態是在繼承上實現的。 圖解多態1 圖解多態2 圖解多態1代碼 圖解多態2代碼 (參考https://www.cnblogs.com/luchuangao/p/6739557.html) 參考:本文參考學習《Python3 Object Oriente ...
  • Python編程 1.1認識python和python基礎 1. Python發展歷史 v 起源 Python的作者,Guido von Rossum,荷蘭人。1982年,Guido從阿姆斯特丹大學獲得了數學和電腦碩士學位。然而,儘管他算得上是一位數學家,但他更加享受電腦帶來的樂趣。用他的話說, ...
  • 一、內部類 1.成員內部類。 (1)成員內部類的實例化: 外部類名.內部類名 變數名=外部類對象.new 內部類名(); (2)在內部類中訪問外部類屬性或方法。 外部類名.this.屬性名 Person.this.name(3)成員內部類聲明的註意事項 ①內部類不能與外部類重名。 ②成員內部類中不能 ...
  • Python是一門什麼語言 編譯型和解釋型 通俗來講,編譯型就是一次性把所有程式寫的代碼都轉換成機器可以識別的語言(機器語言),即可執行文件.exe; 解釋型就是程式每執行到某一條指令,則會有有個稱之為解釋程式的外殼代碼將源代碼轉換成為二進位以供執行,也就是要不斷的解釋,執行,解釋,執行。 因此解釋 ...
  • CORS 本地:無作為 遠程:設置響應頭 response['Access-Control-Allow-Origin'] = "http://127.0.0.1:8888" response['Access-Control-Allow-Methods'] = "PUT" response['Acce ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...