接觸Matlab10年后的一個總結,隨時使用Matlab要掌握的一些要點


  不記得上一次寫超過20行的matlab程序是什么時候了,大概是2013年吧,那個時候寫過2篇文章,實際用到了 一些matlab的內容,超過200行的matlab程序應該要追溯到2011年了,最近為了幫助網友解決我博客一篇文章的問題,把自己2011年的matlab翻出來,感觸頗多,一言難盡,看到昔日熟悉的代碼,我居然能理解,然后還能修修改過,感覺好多年沒用了,連基本函數都忘記了,還是碰到問題還是會寫會改,這里面也說明了編程不簡單是一個記憶和經驗的問題,更重要的是學習的方法和解決問題方法的問題。所以決定寫這篇文章把我說認識的Matlab的東西寫出來,也許再過一些年,我將老去,也不會再用Matlab了,這樣的話,算是給10年Matlab使用之路一個終結吧。

本站Matlab技術文章目錄:【目錄】Matlab和C#混合編程文章目錄

       本文原文地址:接觸Matlab10年后的一個總結,隨時使用Matlab而掌握的一些要點

1.前言

准確的說這篇文章不是給完全的編程新手,特別是以前沒有過一定編程經驗的人准備的。

文章的適合對象是:已經有一定編程基礎的人,如果你想用Matlab來快速的完成算法驗證,以及科研學術研究等。

  文章的范圍很大,信息量很大,個別問題新手不是很理解,請自行百度。至於有編程經驗的,本文提到的大部分內容應該是可以理解的,根據思路,打開Matlab軟件也應該是可以選擇的。

本文選擇的Matlab版本是:2012a,個人覺得這個版本一直都還不錯吧。新的版本雖然菜單中文化,但那個UI真是丑爆了,無力吐槽,也沒必要換。

  另外,這里提醒廣大Matlab使用者,對於80%人來說,低版本真的夠了,沒必要追求太高,特別是那些連破解或者工具箱選擇都不知道啥意思的,選擇一個低版本,麻煩事情可能會更少。新版本的破解很多不全面,自己安裝的時候要注意。很多人碰到這個問題,工具箱都沒安裝,你要找函數,怎么找得到。。。 

2.Matlab的簡單介紹

  在國內,目前使用Matlab的主要人群是學生和科研單位,商業環境的使用我見過一些,但很少。就不做推測和評價了。

  Matlab如何如此受歡迎,我總結是4個方面:

1.高效的數值計算功能。這一點是出類拔萃,目前其他編程語言以及其他類似的數學軟件無可替代;

2.完備的計算結果和編程可視化功能。這一點同樣是出類拔萃,無可替代;我的博客有Matlab專欄,大部分是C#調用Matlab進行混合編程的問題,每一年都有大量的學生和其他工程人員有這個需求:直接調用Matlab的Figure。。。潛入到WinForm中去。。。這和Matlab的結果優秀的可視化功能密不可分;

3.友好完善的編程開發環境,以及接近數學表達式的自然化m語言。非常易於學習和掌握;Matlab軟件就是一個編程開發環境,自帶的m語言簡單易用,有編程開發經驗的人應該是非常容易掌握的;

4.功能豐富的應用工具箱與Help系統,目前Matlab的工具箱總數已經超過80個,覆蓋了數學,統計,仿真,電子,生物信息學,金融,測試等等各個方面。與其說Matlab強大,不如說它的工具箱強大,每一個工具箱都包括與涵蓋了行業內經典的一些算法和處理方法。省去了大量的麻煩,所以對於科研來說,快速的驗證自己的想法,實現算法並進行測試。

3.Matlab開發環境介紹

  如果要使用Matlab,安裝Matlab必不可少,下面是Matlab的主界面,下面介紹幾個主要窗口的作用。本文使用的是Matlab2012a,其他版本如果是Ribbon UI,除了菜單不一樣,窗口也大概類似的。

  上面就是Matlab的主界面,我用的是2012a版本,新版本2013后可能有些改變,感覺更丑。。還是這個習慣。但大概功能都差不多。看看每個部分的功能吧,菜單欄暫時就不說了,看名字一般都能懂。具體說說上圖各個部分的作用。

1.Current Folder:當前路徑。是當前matlab工作文件夾的路徑,這個一般啟動改好后,不會變動,作用不大,但有時候找文件用得上;這里會加載你經常使用的Matlab目錄,可以通過下拉箭頭快速切換不同的Matlab工作路徑;

2.Current Folder:也是當前的工作文件夾的文件顯示,這里顯示文件夾的所有資源,比較好懂,需要打開文件的時候,雙擊對應m文件就可以了;

3.單個m文件或者函數,點擊之后,會在4中顯示包含的函數,就比如VS顯示類中的屬性,方法之類的,可以了解文件結構;

4.是3中選擇文件中包括的函數,不用打開文件夾,就可以看到m文件中的函數結構;

5.Command Window 主窗口,也就是輸入命令的地方,最最重要的地方吧,做一些簡單的測試,學習命令的時候都可以在這里面進行,不過習慣后更喜歡用m文件,習慣就知道了;

6.WorkSpace,工作變量空間,主要是顯示當前matlab中存在的變量的值,包括變量名稱,值,如果是數組,會顯示最大,最小值,這個地方主要是調試程序用的,相當於VS中加斷點后的局部變量的值,只不過這里顯示更加直觀,非常有用。

7.Command History,歷史命令窗口。這里有一個小技巧,就是你在命令窗口輸入的命令,這里都會顯示,而且你還可以用小鍵盤的,上下鍵來直接跳到前面的命令,測試的時候也更加方便; 

4.那些常見的命令

  經常使用Matlab的命令或者進行一些簡單的測試,掌握和知道一些常見的命令是很有必要的,下面這些命令如果記不住,可以根據功能百度,找到對應的函數,再用,其實很快。熟練之后,也就30秒鍾的事情,多了,也就記住了。

1.clear :清除內存變量和函數,也就是把WorkSpace的變量給清空;

2.clc :清楚當前Matlab命令窗口的內容;相當於清楚屏幕吧,重新開始,簡潔一點,注意clc是不清楚變量的。一般在編寫m文件的時候,不是函數的話,前面一般都要加上  clear;clc; 目的就是在m文件運行的時候,把內存和屏幕都清空,以免同名稱的變量影響以及屏幕容易觀察;

3.help :這也是最重要的一個函數吧。在想要知道某個函數的相關說明的時候,可以使用help 函數名來獲取,當然也可以打開幫助文檔。不過這種方法是比較快的。

4.zeros:創建1個都為0的矩陣;ones:創建1個都為1的矩陣。參數可以是多維的,例如zeros(2,3)...

5.size:可以計算矩陣的大小,同樣相關的還有length,size可以計算不同的維上的大小,例如size(A,1)..

6.rand :隨機數生成器,可以直接使用生成任意緯度的矩陣,例如rand(2,3),也是一個經常用的東西;

6.plot:繪制圖像的操作,具體格式可以參考幫助。操作應該非常頻繁,做科研的時候,經常要看趨勢,繪圖在matlab是非常常見的一件事情。。。還有一個subplot函數是將一個figure分割為多個塊來操作。想想自己在C#中用mschart繪圖,也是醉了。。。不過仍然得堅持,這些年來為什么拋棄matlab,所有matlab可以干的事情都拿C#來干,是一個很遠的話題,以后有機會再說吧。

7.figure,hold on :在使用plot繪圖的時候,默認都是在figure上面,figure可以新建一個空白圖像,同時還可以使用hold on在同一個figure上面繪制多條曲線;

  最重要的幾個函數就介紹在這里吧。要掌握matlab的核心語法,還得看一下基本的matlab矩陣操作的語法,太靈活了 ,掌握幾個基本的就可以完成很多工作了。

5.不得不說的矩陣操作

  前面已經提到Matlab最重要的一點強大的數值計算功能,不僅體現其函數庫的強大,更重要的是其操作語法的靈活性。隨便找一本Matlab的編程入門書籍,肯定有這方面的介紹。其實矩陣操作的靈活性,強大到以至於我不敢看,日常只要掌握幾個基本的操作就可以做很多事情了。特別在這里特別介紹一下,可以給你提高不少效率。

5.1 初始化的序列

  在編寫各種算法的時候,經常要對矩陣初始化。例如前面提到的zeros,one,等等都是產生矩陣的方法,同樣還有其他的產生對角矩陣等方法。這里特別要提到的是產生數據或者等差數列的方法。例如

a = 1 : 10 ;%產生1-10的步長默認為1的等差數列;

b = 0:0.1:1;%產生0-1的步長為0.1的等差數量;

  是不是很簡潔高效。。。在其他編程語言,可能自己要封裝一個方法了。然后來調用,但是在matlab里面,這一切都簡化了。

5.2 矩陣操作

  在matlab中,數組或者叫做矩陣是可以任意擴充的,不需要其他,同樣對矩陣的變化易如反掌,不需要那些for循環來進行。看看幾個例子,管中窺豹,大家以此類推:

data = rand(4,4) %初始化1個10*10的隨機矩陣

a = data(:,1) %取data的所有行,第1列

b = data(:,[1,3]) %取所有行,第1,3列

c = data([2,3],[1,2]) %%取第2,3行,以及1,2列

看下面的運行結果,比較直觀:

  其他還有更多,如find就不多說了。。。。這里只是冰山一角。。

6.編程語法

  看完上面的語法,有沒有心動?那接下來看看matlab的m語言的一些基本語法。我們可以在命令行窗口做一些簡單的測試,但並不適合於開放。當我們要完成一個完整的邏輯時,那就要用到m文件編輯器了。打開編輯器,界面如下,你就可以寫了。。。這個開發環境也很強大,可以斷點調試,分步執行。這是一篇總結性的文章,我身邊也沒有了matlab書籍,所以想到哪寫到哪吧。

1.matlab中變量名大小寫敏感的,官方的函數里面也沒有所謂的命名規則,基本都是小寫開頭,習慣就好了

2.注意,如果一行語句結束,后面不加;號,就會直接在Command Window顯示變量的值,加分號就只顯示在WorkSpace了,在命令行窗口也是這樣的,不信你可以試一下, a = 100; 和 b = 100 的區別

3.matlab中,注釋的符號是 %

4.變量無需定義,你可以給它一個[]空值,在使用的時候再賦其他值。它的長度也不是固定的,你可以按你想象進行增加。

5.matlab的數據類型中,個人認為比較變態的是字符和元胞,元胞數組是一個大雜燴,可以容納各種復雜的類型,而字符類型,踩過不少坑,每次都轉不過彎來。這里分享一下。matlab拼接字符串路徑或者數組,不是我們其他編程語言想象的那樣哦。用 + 就可以解決。需要這樣:

  ['ab' 'cde' num2str(2)] %注意中間有空格,結果:abcde2

6.雖然矩陣操作,很靈活,大部分的都可以直接一句話完成,但免不了還是要用循環的。matlab也有for,while語法。需要注意的是,每一層的for 或者while都要對應end 才行。

7.在matlab中,現在也支持面向對象編程,但我不會,使用Matlab暫時也只是用用函數,面向過程的編程啊。。。面向對象編程的使用如果大家有興趣可以去找一下相關資料啊。matlab最常用的還是函數,和其他語言的方法類似。但是matlab的函數沒有靜態方法和實例方法之分,總的來說,都是靜態的吧,直接調用。

編寫函數使用的關鍵字是 function ,輸入和輸出參數可以是多個,例如 function [r1,r2,r3] = testfun(p1,p2,p3)

  這里有一個注意:函數是不能直接運行的,大家可以寫一個m文件調用你寫的函數 就可以了,這個有編程經驗的應該都懂,我要說的是,在c#中調用matlab的函數的時候,必須是function才能夠被編譯和調用,非function是不支持的哦。

7.關於Matlab我想說的話

  雖然會Matlab做很多事情,但現在我已經完全脫離它了,剛開始很多不習慣,比如很多數學函數要自己寫,自己去發掘,但通過慢慢積累,並發掘開源的資源,我使用了Math.NET組件來替代了它的數值計算部分,雖然語法沒那么優雅,但是功能上沒問題了。至於其他的功能組件,比如統計,數據挖掘等工具箱,也有相應的開源組件來完成,實在找不到的,自己根據算法來完成,其實也不難,所以在這個過程中,使用C#的能力也越來越強。

  這並不是說Matlab不好,Matlab目前最大的問題,從實際應用上來說,主要有幾個確定:

1.大的不能再大的MCR運行時,曾幾何時,.NET 幾十M的.net環境,就讓人受不了,更加不用說Matlab的MCR,300多M了。安裝后超過1G。。

2.在與其他平台交互應用還不太靈活與方便,例如在C#中調用Matlab的m函數,雖然現在支持還不錯,但效率和使用門檻還是有一定的差距,不能普及;

3.雖然Matlab在分布式計算,效率以及部署方面花了很大精力,也越來越好用,但是價格讓人望而卻步。。。有幾個工具箱我都沒找到破解版。。無法試用;這方面是一個硬傷吧,別說學習了,即使買了,招幾個這樣的人都是個難事。。。

4.Matlab的資源太少,目前主流的開源項目托管平台,Matlab項目寥寥無幾,雖然官方有一個開源的交流論壇,但人氣太低,而且也是英文的,沒什么用。。加上國內的研究人員,各自為戰,基本不分享一些寫過的Matlab代碼,所以后人前仆后繼,每天都在寫重復的代碼。。。

  每一次安裝系統的時候,總是莫名其妙的要把Matlab給安裝上去,但貌似很少打開,這個月還打開了幾次。。。希望不是終點,Matlab的確是一個好的工具。

最后說一下Matlab的幫助系統吧:在若干年前微軟的MSDN還有離線版的時候,它應該是最好的幫助系統吧。但現在MSDN好像都不包括在VS的安裝包里面了,離線版也沒有多大的意義。但是Matlab一直在這樣做,這也是它強大的原因之一。所以的東西都可以從幫助文檔中得到。但前提你得會基本的英文,這也是一大硬傷吧,沒有中文版,不過想想也可怕,這么多文章翻譯為不同版本,工作量得多大。以前有論壇翻譯這些文檔中的函數,但好像被官方叫停了,版權原因。悲哀,人家給你免費普及做廣告,居然這樣。。。最后附上一張圖,曾經摸爬打滾過的help系統:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM