天天看點

接觸Matlab10年後的一個總結,随時使用Matlab要掌握的一些要點1.前言2.Matlab的簡單介紹3.Matlab開發環境介紹4.那些常見的指令5.不得不說的矩陣操作6.程式設計文法7.關于Matlab我想說的話

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

準确的說這篇文章不是給完全的程式設計新手,特别是以前沒有過一定程式設計經驗的人準備的。

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

  文章的範圍很大,資訊量很大,個别問題新手不是很了解,請自行百度。至于有程式設計經驗的,本文提到的大部分内容應該是可以了解的,根據思路,打開matlab軟體也應該是可以選擇的。

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

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

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

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

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

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

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

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

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

接觸Matlab10年後的一個總結,随時使用Matlab要掌握的一些要點1.前言2.Matlab的簡單介紹3.Matlab開發環境介紹4.那些常見的指令5.不得不說的矩陣操作6.程式設計文法7.關于Matlab我想說的話

  上面就是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,曆史指令視窗。這裡有一個小技巧,就是你在指令視窗輸入的指令,這裡都會顯示,而且你還可以用小鍵盤的,上下鍵來直接跳到前面的指令,測試的時候也更加友善; 

  經常使用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矩陣操作的文法,太靈活了 ,掌握幾個基本的就可以完成很多工作了。

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

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

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

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

看下面的運作結果,比較直覺:

接觸Matlab10年後的一個總結,随時使用Matlab要掌握的一些要點1.前言2.Matlab的簡單介紹3.Matlab開發環境介紹4.那些常見的指令5.不得不說的矩陣操作6.程式設計文法7.關于Matlab我想說的話

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

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

接觸Matlab10年後的一個總結,随時使用Matlab要掌握的一些要點1.前言2.Matlab的簡單介紹3.Matlab開發環境介紹4.那些常見的指令5.不得不說的矩陣操作6.程式設計文法7.關于Matlab我想說的話

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

2.注意,如果一行語句結束,後面不加;号,就會直接在command window顯示變量的值,加分号就隻顯示在workspace了,在指令行視窗也是這樣的,不信你可以試一下, a = 100; 和 b = 100 的差別

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

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

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

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是不支援的哦。

  雖然會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系統:

接觸Matlab10年後的一個總結,随時使用Matlab要掌握的一些要點1.前言2.Matlab的簡單介紹3.Matlab開發環境介紹4.那些常見的指令5.不得不說的矩陣操作6.程式設計文法7.關于Matlab我想說的話